2017-04-27 87 views
0

我需要運行這樣的查詢:更換沒有存在集團通過結果

select SUM(TONS) as TONS 
from MyView 
where Date between '01.01.2017' and '12.31.2017' 
group by DATEPART(MONTH, Date) 
order by DATEPART(YEAR, Date) asc 

的問題是,如果有對3個月沒有數據則返回共有12而不是11行我怎樣才能用值0替換丟失的日期?

+4

創建日曆表和左加入 –

+0

@TimSchmelter,這一次我會做右連接。 (I.e'MyView右加入日曆') – jarlh

回答

1

您可以留下個連接的結果。

SELECT 
     C.M YourMonth, 
     COALESCE(Result.TONS, 0) AS TONS 
    FROM 
    (VALUES(1), (2), (3), (4), (5), (6), (7), (8), (9), (10), (11), (12)) C(M) LEFT JOIN 
    (
     SELECT 
      DATEPART(MONTH, T.Date) YourMonth, 
      SUM(T.TONS) AS TONS 
     FROM  
      MyView T 
     WHERE Date BETWEEN '01.01.2017' and '12.31.2017' 
     GROUP BY  
      DATEPART(MONTH, T.Date) 
    ) Result ON C.M = Result.YourMonth 
+1

非常感謝您的快速解決方案 – fuzunspm

3

您可以創建一個日曆表,並加入到,也可以使用即席日曆,像這樣:

declare @fromdate date = '20170101'; 
declare @thrudate date = '20171231'; 
;with n as (select n from (values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)) t(n)) 
, dates as (
    select top (datediff(day, @fromdate,@thrudate)+1) 
     [Date]=convert(date,dateadd(day,row_number() over(order by (select 1))-1,@fromdate)) 
    from n as deka cross join n as hecto cross join n as kilo 
       cross join n as tenK cross join n as hundredK 
    order by [Date] 
) 
, cal as (
    select 
     [Date] 
    , [Month]=month([Date]) 
    , [Year] =year([Date]) 
    from dates 
) 

select 
    c.[Year] 
    , c.[Month] 
    , Tons = sum(v.Tons) 
from cal c 
    left join MyView v 
    on c.[Date] = v.[Date] 
where c.[Date] >= '20170101' 
    and c.[Date] <= '20171231' 
group by c.[Year], c.[Month] 
order by c.[Year], c.[Month] 

日曆和數字表參考:

+0

感謝您的解決方案。我想不出這樣可以爲我節省數小時的工作時間 – fuzunspm

+0

@TimSchmelter我只把自己限制在三個頁面中的一個。我想如果有人有興趣點擊鏈接,他們可以自己找到自己的第一頁和第三頁。 - 另外,第二頁顯示了遞歸cte的糟糕表現,這是堆疊cte的常見替代方法。遞歸cte不在第三頁上,因爲它表現得如此糟糕,它「只能用來扭曲圖表」。 – SqlZim

+0

@fuzunspm樂意幫忙! – SqlZim