我有下面的数据集,其中1/18上没有纽约的数据,2/18上没有里约的数据。
City NoOfRecords Date
Paris 15 1/16/2018
Rio 20 1/16/2018
Munich 10 1/16/2018
New York 25 1/16/2018
Paris 15 1/18/2018
Rio 20 1/18/2018
Munich 10 1/18/2018
Paris 15 2/18/2018
New York 20 2/18/2018
Munich 10 2/18/2018
但是,对于我的报告,我需要分别在1/18和2/28的一行上记录0条纽约和里约热内卢记录,并且预计输出如下:
City NoOfRecords Date
Paris 15 1/16/2018
Rio 20 1/16/2018
Munich 10 1/16/2018
New York 25 1/16/2018
Paris 15 1/18/2018
Rio 20 1/18/2018
Munich 10 1/18/2018
New York 0 2/18/2018
Paris 15 2/18/2018
New York 20 2/18/2018
Munich 10 2/18/2018
Rio 0 2/18/2018
如何在每次没有动态记录时插入一行?
答案 0 :(得分:0)
您可以使用cross apply
创建城市和日期的子集,并将join
创建到实际表中。通常,您会使用日历表,但是在这里,您似乎只想要至少一个城市有记录的日期。
declare @table table (city varchar(64), NoOfRecords int, [Date] date)
insert into @table
values
('Paris',15,'1/16/2018'),
('Rio',20,'1/16/2018'),
('Munich',10,'1/16/2018'),
('New York',25,'1/16/2018'),
('Paris',15,'1/18/2018'),
('Rio',20,'1/18/2018'),
('Munich',15,'1/18/2018'),
('Paris',15,'2/18/2018'),
('New York',20,'2/18/2018'),
('Munich',30,'2/18/2018')
select distinct
x.city
,coalesce(t.NoOfRecords,0)
,x.Date
from (
select
distinct x.city, y.Date
from @table x
cross apply (select distinct date from @table) y
) x
left join
@table t on t.city =
或者在派生表中带有cross join
。
select distinct
x.city
,coalesce(t.NoOfRecords,0)
,x.Date
from (
select
distinct x.city, y.Date
from @table x
cross join @table y
) x
left join
@table t on t.city = x.city and t.Date = x.Date