Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 mssql sum(null)  [new]
НиколайСН
Member

Откуда:
Сообщений: 120
Салют!

в mssql есть функция sum(), которая отрабатывает следующим образом:
SELECT SUM(Val)
FROM
(
SELECT 100.0
UNION ALL SELECT 200
UNION ALL SELECT 300
UNION ALL SELECT 400
UNION ALL SELECT 500
UNION ALL SELECT 600
UNION ALL SELECT NULL
) AS a(Val)


Выдается предупреждение где NULL был проигнорирован. Логично.

НО, вопрос, а если мне надо чтобы в итоге был именно NULL?

И давайте усложним задачку взяв еще пару полей:

with a (Val, Con, Pok) as
(
SELECT 100.0 as Val, 123 as Con, 999 as Pok
UNION ALL SELECT 200 as Val, 123 as Con, 999 as Pok
UNION ALL SELECT 300 as Val, 123 as Con, 999 as Pok
UNION ALL SELECT 400 as Val, 123 as Con, 999 as Pok
UNION ALL SELECT 500 as Val, 123 as Con, 999 as Pok
UNION ALL SELECT 600 as Val, 123 as Con, 999 as Pok
UNION ALL SELECT 700 as Val, 123 as Con, 999 as Pok
) 
, b (Val, Con, Pok) as 
(
SELECT 1.0 as Val, 123 as Con, 999 as Pok
UNION ALL SELECT 2 as Val, 123 as Con, 999 as Pok
UNION ALL SELECT 3 as Val, 123 as Con, 999 as Pok
UNION ALL SELECT 4 as Val, 123 as Con, 999 as Pok
UNION ALL SELECT 5 as Val, 123 as Con, 999 as Pok
UNION ALL SELECT 6 as Val, 123 as Con, 999 as Pok
UNION ALL SELECT NULL as Val, 123 as Con, 999 as Pok
) 
SELECT 
	a.Pok
	,SUM(a.Val * b.Val)
	,a.Con
FROM a
   LEFT JOIN b on (a.Con=b.Con and a.Pok = b.Pok)
Group by 
	a.Con
	,a.Pok




Какое именно из значений может быть пустым в таблице "b" - неизвестно, но если она где-то есть, то ИТОГО должно быть NULL, а сейчас 58800.00
9 авг 17, 18:29    [20711734]     Ответить | Цитировать Сообщить модератору
 Re: mssql sum(null)  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36926
Ну напишите case when exists ... where ... is null then null else sum () end
9 авг 17, 18:34    [20711742]     Ответить | Цитировать Сообщить модератору
 Re: mssql sum(null)  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
или домножь MIN(case when b.Val is null then 0 else 1 end)
9 авг 17, 18:37    [20711746]     Ответить | Цитировать Сообщить модератору
 Re: mssql sum(null)  [new]
НиколайСН
Member

Откуда:
Сообщений: 120
buser,
на выходе будет "НОЛЬ", поэтому спасибо за идею, и чуточку дописав условие - получим
case when MIN(case when b.Val is null then 0 else 1 end) = 0 then null else 1 end 
10 авг 17, 11:08    [20712908]     Ответить | Цитировать Сообщить модератору
 Re: mssql sum(null)  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
НиколайСН,
NULLIF
10 авг 17, 11:17    [20712925]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить