Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как вытянуть NULL из SUM ?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
При суммировании необходимо получать нуллевые значения.
Например:
Declare @t table (K int, F int)
INSERT INTO @t SELECT 1,0 union SELECT 2,1 union SELECT 3,null
SELECT 
  SUM(CASE WHEN K = 1 THEN F ELSE 0 END) as F1,
  SUM(CASE WHEN K = 2 THEN F ELSE 0 END) as F2,
  SUM(CASE WHEN K = 3 THEN F ELSE 0 END) as F3
FROM @t

Получается:
F1          F2          F3
----------- ----------- -----------
0 1 0
Warning: Null value is eliminated by an aggregate or other SET operation.


А мне нужно что-б было

F1          F2          F3
----------- ----------- -----------
0 1 NULL


Кто-то делал такое? Есть идеи?
8 дек 11, 17:12    [11731121]     Ответить | Цитировать Сообщить модератору
 Re: Как вытянуть NULL из SUM ?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
nullif
8 дек 11, 17:14    [11731141]     Ответить | Цитировать Сообщить модератору
 Re: Как вытянуть NULL из SUM ?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
невнимательно посмотрел, извините
8 дек 11, 17:15    [11731156]     Ответить | Цитировать Сообщить модератору
 Re: Как вытянуть NULL из SUM ?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Declare @t table (K int, F int)
INSERT INTO @t SELECT 1,0 union SELECT 2,1 union SELECT 3,null
SELECT 
  SUM(CASE WHEN K = 1 THEN F END) as F1,
  SUM(CASE WHEN K = 2 THEN F END) as F2,
  SUM(CASE WHEN K = 3 THEN F END) as F3
FROM @t

F1          F2          F3
----------- ----------- -----------
0           1           NULL
Warning: Null value is eliminated by an aggregate or other SET operation.

(1 row(s) affected)
8 дек 11, 17:17    [11731169]     Ответить | Цитировать Сообщить модератору
 Re: Как вытянуть NULL из SUM ?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Паганель
Declare @t table (K int, F int)
INSERT INTO @t SELECT 1,0 union SELECT 2,1 union SELECT 3,null
SELECT 
  SUM(CASE WHEN K = 1 THEN F END) as F1,
  SUM(CASE WHEN K = 2 THEN F END) as F2,
  SUM(CASE WHEN K = 3 THEN F END) as F3
FROM @t

F1          F2          F3
----------- ----------- -----------
0           1           NULL
Warning: Null value is eliminated by an aggregate or other SET operation.

(1 row(s) affected)
Cпасибо. Может и прокатит, но проблемы начинаются вот тут:
Declare @t table (K int, F int)
INSERT INTO @t SELECT 1,0 union SELECT 2,1 union SELECT 3,null union SELECT 3,2
SELECT 
  SUM(CASE WHEN K = 1 THEN F ELSE 0 END) as F1,
  SUM(CASE WHEN K = 2 THEN F ELSE 0 END) as F2,
  SUM(CASE WHEN K = 3 THEN F ELSE 0 END) as F3
FROM @t

F1          F2          F3
----------- ----------- -----------
0           1           2
Warning: Null value is eliminated by an aggregate or other SET operation.


А нужен всё равно NULL.
8 дек 11, 17:24    [11731256]     Ответить | Цитировать Сообщить модератору
 Re: Как вытянуть NULL из SUM ?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
select 
   case when S1 is null then F1 end as F1,
   case when S2 is null then F2 end as F2,
   case when S3 is null then F3 end as F3
from (
SELECT 
  SUM(CASE WHEN K = 1 THEN F END) as F1,
  SUM(CASE WHEN K = 2 THEN F END) as F2,
  SUM(CASE WHEN K = 3 THEN F END) as F3,
  SUM(CASE WHEN K = 1 and F is null THEN 1 END) as S1,
  SUM(CASE WHEN K = 2 and F is null THEN 1 END) as S2,
  SUM(CASE WHEN K = 3 and F is null THEN 1 END) as S3
FROM @t
) as t
8 дек 11, 17:29    [11731335]     Ответить | Цитировать Сообщить модератору
 Re: Как вытянуть NULL из SUM ?  [new]
qwrqwr
Member

Откуда: Msk
Сообщений: 1684
или так (не пропадать же):
Declare @t table (K int, F int)
INSERT INTO @t SELECT 1,0 union SELECT 2,1 union SELECT 3,null union SELECT 3,2
SELECT 
    CASE WHEN COUNT(CASE WHEN K = 1 THEN F END) = COUNT(CASE WHEN K = 1 THEN 1 END) THEN SUM(CASE WHEN K = 1 THEN F END) END as F1
  , CASE WHEN COUNT(CASE WHEN K = 2 THEN F END) = COUNT(CASE WHEN K = 2 THEN 1 END) THEN SUM(CASE WHEN K = 2 THEN F END) END as F2
  , CASE WHEN COUNT(CASE WHEN K = 3 THEN F END) = COUNT(CASE WHEN K = 3 THEN 1 END) THEN SUM(CASE WHEN K = 3 THEN F END) END as F3
FROM @t
8 дек 11, 17:32    [11731384]     Ответить | Цитировать Сообщить модератору
 Re: Как вытянуть NULL из SUM ?  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Cпасибо ребята, так потянет.
8 дек 11, 18:10    [11731780]     Ответить | Цитировать Сообщить модератору
 Re: Как вытянуть NULL из SUM ?  [new]
(c)VIG
Member

Откуда:
Сообщений: 1507
или так
Declare @t table (K int, F int)
INSERT INTO @t SELECT 1,0 union SELECT 2,1 union SELECT 3,null union SELECT 3,2
SELECT  sum(case when k=1 then f end)+ nullif(sign(sum(case when k=1 then isnull(1-sign(2+sign(f)),1) end)),1) f1
       ,sum(case when k=2 then f end)+ nullif(sign(sum(case when k=2 then isnull(1-sign(2+sign(f)),1) end)),1) f2
       ,sum(case when k=3 then f end)+ nullif(sign(sum(case when k=3 then isnull(1-sign(2+sign(f)),1) end)),1) f3
FROM @t;
8 дек 11, 22:40    [11732997]     Ответить | Цитировать Сообщить модератору
 Re: Как вытянуть NULL из SUM ?  [new]
step_ks
Member

Откуда:
Сообщений: 936
Declare @t table (K int, F int)
INSERT INTO @t SELECT 1,0 union all SELECT 2,1 union all SELECT 3,null union all SELECT 3,2

SELECT  sum(case when k=1 then f end)+nullif(max(case when k=1 then fn end),1) f1  
       ,sum(case when k=2 then f end)+nullif(max(case when k=2 then fn end),1) f2
       ,sum(case when k=3 then f end)+nullif(max(case when k=3 then fn end),1) f3
FROM ( select k, f, fn=case when f is null then 1 else 0 end from @t) t;
8 дек 11, 23:49    [11733389]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить