2016-02-08 3 views
0

Как удалить нули и заменить их нулевыми значениями, учитывая, что они действительно не являются нулевым значением?Pivot with giveniff

Мои рабочие данные

id  class  startdate  enddate  
1  High  1/1/15  2/1/15  
1   Low  5/1/15  6/1/15  
1   Mid  6/1/15  6/10/15 
2  Mid-low  6/1/15  6/10/15 

Мой запрос ниже

select y.id, y.startdate, y.enddate, ISNULL(y.High,'') AS HIGH, ISNULL(y.MID,'') AS MID, ISNULL(y.LOW,'') AS LOW, ISNULL(y.Mid-low,'') AS Mid-low, 
from 
(
select id, class, datediff(day, startDate, endDate) as days 
from @test 
) x 
pivot 
(
max(days) for class in (high, low, med) 
) y 

Это возвращает установленное значение ниже

id  High  Mid low Mid-low 
    1  30   9  30   0 
    2  0   0  0   30 

ответ

0

Имея на этот пост в ответ, чтобы показать код. Я не могу воспроизвести результаты OP.

Этот код:

DECLARE @Table TABLE (
    ColA char(1) 
,ColB int 
); 

INSERT INTO @Table(ColA,ColB) VALUES ('A',NULL); 

SELECT * FROM (
SELECT ColA,ColB 
FROM @Table 
)x 
PIVOT (
SUM(ColB) FOR ColA IN (A,B) --same result if SUM() is changed to MAX() 
) y; 

Результаты в:

A  B 
NULL NULL 

Так OP, безусловно, делает нечто большее, чем его пример показывает, что получают нули в его/ее результаты.

1

Используйте NULLIF() функции:

NULLIF возвращает первое выражение, если два выражения не равны. Если выражения равны, NULLIF возвращает нулевое значение типа первого выражения.

select id,NULLIF(high,0) AS high,NULLIF(med,0) AS med,NULLIF(low,0) AS low 
from 
(
select id, class, datediff(day, startDate, endDate) as days 
from @test 
) x 
pivot 
(
max(days) for class in (high, low, med) 
) y 
+0

Однако имейте в виду, что NULLIF() не будет различать числа, которые фактически равны нулю, и числа, которые были NULL, которые суммируются с нулем. Все нули будут отображаться как NULL. –

+0

@TabAlleman Правильно, и у меня есть случаи, когда нуль на самом деле равен нулю. Есть ли способ обойти это? –

+0

@TabAlleman Мне, должно быть, что-то не хватает здесь ... где это суммирование продолжается? Я не вижу 'SUM()' в его запросе PIVOT, только 'MAX()'. –