2013-03-15 3 views
0

총 매출을 월로 제공하는 쿼리가 있습니다. 그러나 판매가없는 몇 달이 있습니다. 쿼리 결과에서 해당 월의 0 값을 어떻게 얻었습니까?누락 된 요약 데이터를 얻는 방법

SELECT 
    p.Part, 
    SUM(s.Sales) AS Sales, 
    MONTH(s.SalesDate) AS Month_Sold 
FROM 
    Parts p 
    LEFT OUTER JOIN Sales s ON p.Part = s.Part 
GROUP BY 
    p.Part, 
    MONTH(s.SalesDate) 
ORDER BY 
    p.Part, 
    Month_Sold 

답변

2

SUM(ISNULL(s.Sales, 0))을 수행하면 NULL 값이 집계에 의해 제거되지 않습니다. 비록 당신이 당신의 판매 데이터에서 당신의 달에 의존하고 있기 때문에 당신은 당신이 당신의 판매 데이터를 가지고 있지 않더라도 모든 달을 볼 수 있도록 월 조회를해야 할 것입니다.

그래서,이 같은 :

;WITH months AS 
    (
     SELECT 1 AS mo 
     UNION ALL 
     SELECT mo +1 
     FROM months 
     WHERE mo < 12 
    ) 

    SELECT p.Part, SUM(s.Sales) AS Sales, mo AS Month_Sold 
    FROM Parts p 
    CROSS APPLY months 
    LEFT OUTER JOIN Sales s 
     ON p.Part = s.Part 
     AND months.mo = MONTH(s.SalesDate) 
    GROUP BY p.Part, months.mo ORDER BY p.Part, Month_Sold 
+0

그것은 당신이 또한 연도별로 그룹화 또는 필터링하지 않는 경우 그 자체로 그 MONTH()가 부정확 할 수 있습니다 주목할 가치가있다. –

+0

예, 방금 보았습니다. 연도도 추가해야합니다. 어떻게 성취 될 수 있습니까? – tsqln00b

+0

@ user2174734 따라서 1 년에 원하는 경우 @Year 매개 변수를 추가하여 월 CTE의 열로 추가하고 Sales를 필터링 할 수 있습니다. 그렇지 않은 경우 년 미만의 다른 CTE를 사용하여 연도 열과 비슷한 작업을 수행 할 수 있습니다. '년으로 (SELECT 2010 년으로 yr, 월 노동 조합에서 모든 선택 yr + 1, 년에서 년 yr <2014)' –

관련 문제