Member 12770648 Ответов: 1

Расчет разницы не выходит хорошо


Уважаемый Эксперт,

Расчет разницы и вывод не верны.

DIFFCQ1C
DIFFCQ2C
DIFFCQ3C
DIFFCQ4C


Пожалуйста, ознакомьтесь и посоветуйте ;


база данных MS SQL SERVER 2008

Проблемная область

КОАЛЕСЦИРОВАТЬ((C. Q1Y2C-A. Q1Y1C) , 0) DIFFCQ1C ,
КОАЛЕСЦИРОВАТЬ((C. Q2Y2C-A. Q2Y1C) , 0) DIFFCQ2C ,
КОАЛЕСЦИРОВАТЬ((C. Q3Y2C-A. Q3Y1C) , 0) DIFFCQ3C ,
КОАЛЕСЦИРОВАТЬ((C. Q4Y2C-A. Q4Y1C) , 0) DIFFCQ4C


Выберите BRNNAME А.,очков А. , сливаются(А. Q1Y1C, 0) Q1Y1C , сливаются(С. Q1Y2C, 0) Q1Y2C ,
КОАЛЕСЦИРОВАТЬ(A. Q2Y1C, 0) Q2Y1C , КОАЛЕСЦИРОВАТЬ(C. Q2Y2C, 0) Q2Y2C ,
КОАЛЕСЦИРОВАТЬ(A. Q3Y1C, 0) Q3Y1C , КОАЛЕСЦИРОВАТЬ(C. Q3Y2C, 0) Q3Y2C ,
КОАЛЕСЦИРОВАТЬ(A. Q4Y1C, 0) Q4Y1C , КОАЛЕСЦИРОВАТЬ(C. Q4Y2C, 0) Q4Y2C,
КОАЛЕСЦИРОВАТЬ((C. Q1Y2C-A. Q1Y1C) , 0) DIFFCQ1C ,
КОАЛЕСЦИРОВАТЬ((C. Q2Y2C-A. Q2Y1C) , 0) DIFFCQ2C ,
КОАЛЕСЦИРОВАТЬ((C. Q3Y2C-A. Q3Y1C) , 0) DIFFCQ3C ,
КОАЛЕСЦИРОВАТЬ((C. Q4Y2C-A. Q4Y1C) , 0) DIFFCQ4C
ОТ Y1C A
Присоединяйтесь к Y1P B на A. BRNNAME=B.BRNNAME и A. оценка=B.СЧЕТ
Присоединяйтесь к Y2C C на A. BRNNAME=C. BRNNAME и A. SCORE=C.СЧЕТ
Присоединяйтесь Y2P D на А. BRNNAME=Д. BRNNAME и результат А.=Д.СЧЕТ
Заказ от A. BRNNAME


BRNNAME ОЦЕНКА Q1Y1C Q1Y2C Q2Y1C Q2Y2C Q3Y1C Q3Y2C Q4Y1C Q4Y2C DIFFCQ1C DIFFCQ2C DIFFCQ3C DIFFCQ4C
КЕЙП-КОСТ В ВОСТОРГЕ 2 2 5 3 2 2 8 7 0 -2 0 -1
КЕЙП-КОСТ ХОРОШИЙ 1 1 1 0 0 0 1 1 0 0 0 0
ХОХОЭ В ВОСТОРГЕ 4 0 0 0 4 5 4 4 0 0 1 0
ХО-ХО-ХО ХОРОШО 2 2 0 0 2 2 2 2 0 0 0 0
ХОХО УДОВЛЕТВОРИТЕЛЬНО 1 0 1 2 0 0 1 1 0 1 0 0
ХОХО НЕСЧАСТНЫЙ 1 0 1 1 0 1 1 1 0 0 0 0
КУМАСИ ПЛОХОЙ 1 1 0 0 0 0 1 1 0 0 0 0
КУМАСИ В ВОСТОРГЕ 0 0 3 3 3 3 6 6 0 0 0 0
КУМАСИ ХОРОШО 0 0 1 1 0 0 1 1 0 0 0 0

Что я уже пробовал:

Это коды в стадии разработки.

ZurdoDev

И в чем же проблема?

1 Ответов

Рейтинг:
1

CHill60

Вы используете COALESCE на неправильном уровне.

Если вы используете нулевое значение в вычислении, то весь результат становится нулевым. То, что вы, кажется, хотите, это рассматривать каждое нулевое значение как 0 и использовать 0 в вычислении.

Вот очень простой пример того, что я имею в виду

DECLARE  @table TABLE (Col1 INT NULL, Col2 INT NULL)

INSERT INTO @table (Col1, Col2) VALUES
(NULL, NULL),
(10, NULL),
(NULL, 10),
(20, 5),
(5, 20)

Если я хочу перечислить различия между Col1 и Col2 для каждой строки, я мог бы начать с чего-то вроде этого:
SELECT Col1 - Col2 FROM @table
Но это даст мне результаты:
NULL
NULL
NULL
15
-15
Ваш запрос делает эквивалент:
SELECT COALESCE(Col1 - Col2,0) FROM @table
что и дает результаты
0
0
0
15
-15

Мой способ состоял бы в том, чтобы написать запрос как:
SELECT ISNULL(Col1,0) - ISNULL(Col2,0) FROM @table
Результаты:
0
10
-10
15
-15

Так, на заметку:
а) я объединяю каждую колонку индивидуально
б) я использовал ISNULL вместо COALESCE. Они делают точно то же самое, но ISNULL (по-видимому) немного быстрее, когда у вас есть только два элемента для объединения. И это немного быстрее печатать :-)

Ваш запрос должен выглядеть примерно так
SELECT A.BRNNAME,A.SCORE , COALESCE(A.Q1Y1C, 0) Q1Y1C , COALESCE(C.Q1Y2C, 0) Q1Y2C ,
 COALESCE(A.Q2Y1C, 0) Q2Y1C , COALESCE(C.Q2Y2C, 0) Q2Y2C ,
 COALESCE(A.Q3Y1C, 0) Q3Y1C , COALESCE(C.Q3Y2C, 0) Q3Y2C ,
 COALESCE(A.Q4Y1C, 0) Q4Y1C , COALESCE(C.Q4Y2C, 0) Q4Y2C,
 ISNULL(C.Q1Y2C,0)-ISNULL(A.Q1Y1C,0) DIFFCQ1C ,
 ISNULL(C.Q2Y2C,0)-ISNULL(A.Q2Y1C, 0) DIFFCQ2C ,
 ISNULL(C.Q3Y2C,0)-ISNULL(A.Q3Y1C, 0) DIFFCQ3C ,
 ISNULL(C.Q4Y2C,0)-ISNULL(A.Q4Y1C, 0) DIFFCQ4C 
 FROM Y1C A
 JOIN Y1P B ON A.BRNNAME=B.BRNNAME AND A.SCORE=B.SCORE
 JOIN Y2C C ON A.BRNNAME=C.BRNNAME AND A.SCORE=C.SCORE
 JOIN Y2P D ON A.BRNNAME=D.BRNNAME AND A.SCORE=D.SCORE
 ORDER BY A.BRNNAME
но, очевидно, я не смог это проверить.