2016-06-06 33 views
3

Ich suchte nach vielen Lösungen auf SO und anderswo, aber konnte nicht ganz verstehen, wie man eine Abfrage für mein Problem schreibt.SQL ISNULL Zustand in Sql Pivot und Sql Fall

Auf jeden Fall meine Abfrage sieht aus wie unten

SELECT * FROM 
(
    SELECT Id, Date, Name, Amount, 
    CASE 
     WHEN DATEDIFF(DAY,Date,GETDATE()) <=0 
     THEN 'Current' 
     WHEN DATEDIFF(DAY,Date,GETDATE()) <30 
     THEN 'Due30' 
     WHEN DATEDIFF(DAY,Date,GETDATE()) <60 
     THEN 'Due60' 
     ELSE 'Due90' 
    END AS  [Age] 
    FROM Statement 
    WHERE (Amount <> 0) 

) AS S 
PIVOT 
(
    SUM(Amount) 
    FOR[Age] IN ([Current],[Due30],[Due60],[Due90]) 
) P 

und das Ergebnis sieht wie folgt aus

Id Date  Name Current  Due30  Due60 Due90 
----------- ---------- -------------------------------------------- 
    1 2016-04-03 Alan  NULL  NULL  NULL  110.00 
    2 2016-05-02 TC  NULL  NULL  30.00 NULL 

wo sollte ich IsNull Zustand einsetzen zu können, die null im Ergebnis entfernen und hinzufügen eine Null dort.

Ich versuchte IsNull in der Pivot-Abfrage einfügen, aber wir alle wissen, dass nicht

Antwort

3

arbeiten gemeint ist, Sie haben es in der letzten SELECT wiederholt hinzufügen, wenn Sie die SELECT * (welche nur ersetzen, sollte vorhanden sein in ad-hoc-Abfragen oder EXISTS Tests) mit der Spaltenliste:

SELECT 
    Id, 
    Date, 
    Name, 
    COALESCE([Current],0) as [Current], 
    COALESCE(Due30,0) as Due30, 
    COALESCE(Due60,0) as Due60, 
    COALESCE(Due90,0) as Due90 
FROM 
(
    SELECT Id, Date, Name, Amount, 
    CASE 
     WHEN DATEDIFF(DAY,Date,GETDATE()) <=0 
     THEN 'Current' 
     WHEN DATEDIFF(DAY,Date,GETDATE()) <30 
     THEN 'Due30' 
     WHEN DATEDIFF(DAY,Date,GETDATE()) <60 
     THEN 'Due60' 
     ELSE 'Due90' 
    END AS  [Age] 
    FROM Statement 
    WHERE (Amount <> 0) 

) AS S 
PIVOT 
(
    SUM(Amount) 
    FOR[Age] IN ([Current],[Due30],[Due60],[Due90]) 
) P 

ich habe auch COALESCE da es in der Regel der bevorzugte Option (ANSI-Standard ist, erstreckt sich auf mehr als zwei Argumente, wendet normale Vorrangregeln an) anstelle von ISNULL.

+0

das funktioniert perfekt! danke .. dint denke über Coalesce als Option :) –

0
SELECT Id 
    , [Date] 
    , Name 
    , [Current] = SUM(CASE WHEN val <= 0 THEN Amount ELSE 0 END) 
    , Due30 = SUM(CASE WHEN val < 30 THEN Amount ELSE 0 END) 
    , Due60 = SUM(CASE WHEN val < 60 THEN Amount ELSE 0 END) 
    , Due90 = SUM(CASE WHEN val >= 60 THEN Amount ELSE 0 END) 
FROM dbo.[Statement] t 
CROSS APPLY (
    SELECT val = DATEDIFF(DAY, [Date], GETDATE()) 
) s 
WHERE Amount <> 0 
GROUP BY Id, [Date], Name