2016-06-06 3 views
3

SO 및 다른 곳에서 많은 솔루션을 검색했지만 내 문제에 대한 쿼리 작성 방법을 이해할 수 없습니다. Sql Pivot 및 Sql 경우의 Sql ISNULL 조건

어쨌든 내 쿼리 보인다 같은

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 

그 결과는 내가 결과에 null를 제거하고 추가 할 수 IsNull 조건을 삽입해야이

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 

처럼 보인다 이하 거기에 제로.

나는 피벗 쿼리에 IsNull를 삽입하려했지만 우리 모두는이 당신은 당신 만하는 존재해야합니다 (SELECT *를 교체 할 때, 최종 SELECT에 반복적으로 추가해야

답변

3

를 작동하는 것은 아닙니다 알고 열 목록에 임시 쿼리 또는 EXISTS 시험)에 : 그것은 일반적으로 선호하는 옵션 (ANSI 표준의 두 개 이상으로 확장하기 위해 (때문에)

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 

또한 COALESCE을 사용했습니다 인수는 일반 형식 선행 규칙을 적용합니다). ISNULL 대신.

+0

완벽하게 작동합니다! 고마워 .. dint는 병합을 선택으로 생각해. :) –

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