数据不存在时如何插入行

时间:2019-01-16 20:50:30

标签: sql-server sql-server-2016

我有下面的数据集,其中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

如何在每次没有动态记录时插入一行?

1 个答案:

答案 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