我目前有一个返回3列的脚本:
代码,日期,CountRows(见下图):
每个键都有一个开始和结束日期。我希望所有日期都返回,无论countRows是0,因为该日期没有数据。即第10行和第11行缺少2个日期。
修改
所以我做了左连接,如:
SELECT c.calendarDate, x.*
FROM Calendar c
LEFT JOIN (
SELECT key, orderDate, keyStartDate, keyEndDate, count(*) FROM multiple tables
GROUP BY ...) x ON c.date >= x.startDdate AND c.date < DATEADD(DD,1,x.endDate)
输出:
这就是它的作用。基本上orderDate不会返回数据不存在的所有日期。因此,我需要左连接以确保日期在开始日期和结束日期之间以及订单日期无法找到数据的位置,然后日历会给出日期,其中count(*)返回到0.
答案 0 :(得分:1)
创建一个日历表并保持对数据的连接。在这个例子中,我正在创建一个临时日历表,但出于性能原因和可重用性,我建议创建一个永久日历表。
declare @calendar table (someDate date);
declare @x date = '11/1/2015';
while @x <= '12/1/2015' begin
insert into @calendar values (@x);
set @x = dateadd(d, 1, @x);
end;
--generate some sample data
declare @facts table (someDate date);
insert into @facts values ('11/1/2015'), ('11/1/2015'), ('11/10/2015'), ('11/20/2015'), ('11/21/2015'), ('11/5/2015'), ('11/9/2015');
select
cal.someDate,
CountRows = count(f.SomeDate)
from
@calendar cal
left join @facts f on cal.someDate = f.someDate
group by
cal.someDate
order by
cal.someDate;
这个问题的答案对于创建日历表有一些很好的建议: