我需要運行這樣的查詢:更換沒有存在集團通過結果
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替換丟失的日期?
我需要運行這樣的查詢:更換沒有存在集團通過結果
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替換丟失的日期?
您可以留下個連接的結果。
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
非常感謝您的快速解決方案 – fuzunspm
您可以創建一個日曆表,並加入到,也可以使用即席日曆,像這樣:
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]
日曆和數字表參考:
創建日曆表和左加入 –
@TimSchmelter,這一次我會做右連接。 (I.e'MyView右加入日曆') – jarlh