tally 表的可能解决方案。
样本数据
将当前查询移至子查询或公用表表达式 (CTE),以便您可以对其进行左连接。在这里,我刚刚从您当前的查询中重新创建了结果行。
create table AvailableData
(
Month int,
Day int,
Hour int,
Interval int,
TotalJobs int
);
insert into AvailableData (Month, Day, Hour, Interval, TotalJobs) values
(1, 1, 1, 3, 123),
(1, 1, 2, 4, 456),
(1, 1, 4, 1, 789);
解决方案
为您提供 2021 年的前两个月。更新 CTE 的 Tally 和 Intervals 以获得更多增量数字和更多月份。
with Tally (n) as
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n) -- 10^1 = 10
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n) -- 10^2 = 100
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n) -- 10^3 = 1000
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d(n) -- 10^4 = 10000
),
Intervals as
(
select top (2*31*24*4) -- increase as required, max determined by Tally, example for 2 months
--t.n,
--dateadd(day, (t.n-1)/(24*4), '2021-01-01') as [Date],
datepart(month, dateadd(day, (t.n-1)/(24*4), '2021-01-01')) as [Month],
datepart(day, dateadd(day, (t.n-1)/(24*4), '2021-01-01')) as [Day],
(((t.n-1) % (24*4)))/4 +1 as [Hour],
( (t.n-1) % 4 ) +1 as [Interval]
from Tally t
)
select i.Month,
i.Day,
i.Hour,
i.Interval,
coalesce(ad.TotalJobs, 0) as TotalJobs
from Intervals i
left join AvailableData ad
on ad.Month = i.Month
and ad.Day = i.Day
and ad.Hour = i.Hour
and ad.Interval = i.Interval;
Fiddle 带有一些中间结果。
完整解决方案
2021 年全年的快速合并和编辑。未验证。
with Tally (n) as
(
SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL))
FROM ( VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) a(n) -- 10^1 = 10
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) b(n) -- 10^2 = 100
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) c(n) -- 10^3 = 1000
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) d(n) -- 10^4 = 10000
CROSS JOIN (VALUES(0),(0),(0),(0),(0),(0),(0),(0),(0),(0)) e(n) -- 10^5 = 100000
),
Intervals as
(
select top (365*24*4) -- full year of 2021
datepart(month, dateadd(day, (t.n-1)/(24*4), '2021-01-01')) as [Month],
datepart(day, dateadd(day, (t.n-1)/(24*4), '2021-01-01')) as [Day],
(((t.n-1) % (24*4)))/4 +1 as [Hour],
( (t.n-1) % 4 ) +1 as [Interval]
from Tally t
),
AvailableData as
(
SELECT
DATEPART(MONTH, Datim) AS [Month],
DATEPART(DAY, Datim) AS [Day],
(DATEPART(HOUR, Datim) + 1) AS [Hour],
((DATEPART(MINUTE, Datim) / 15) + 1) AS [Interval],
COUNT(JobNumber) AS TotalJobs
FROM Table
WHERE (Datim >= '2020-01-01' AND Datim <= '2021-01-01')
GROUP BY
DATEPART(MONTH, Datim),
DATEPART(DAY, Datim),
(DATEPART(HOUR, Datim) + 1),
((DATEPART(MINUTE, Datim) / 15) + 1)
)
select i.Month,
i.Day,
i.Hour,
i.Interval,
coalesce(ad.TotalJobs, 0) as TotalJobs
from Intervals i
left join AvailableData ad
on ad.Month = i.Month
and ad.Day = i.Day
and ad.Hour = i.Hour
and ad.Interval = i.Interval
order by i.Month,
i.Day,
i.Hour,
i.Interval;