SQL插入丢失的行没有匹配

时间:2018-04-11 10:55:52

标签: sql sql-server-2005

我有一个问题,我目前有一个表填充数据并按周汇总,不幸的是数据来自的表没有每个人每周的条目(很多原因),因此我想根据第一个临时表和周检查临时表

的结果创建一个表

这是首次选择临时表

的结果

表1

Logger Name AGENT   ManagerName AGENT_ID    Week    Logs    MonthID
Logger1     Agent1  Manager1    ID1         42      25      179
Logger1     Agent1  Manager1    ID1         44      120     180
Logger1     Agent1  Manager1    ID1         45      11      180
Logger1     Agent1  Manager1    ID1         48      41      181
Logger1     Agent1  Manager1    ID1         49      223     181
Logger1     Agent1  Manager1    ID1         50      92      181

表2(临时周)进行检查

Week    Month
40      179
41      179
42      179
43      179
44      180
45      180
46      180
47      180
48      181
49      181
50      181

结束表所需结果(已添加表1中缺失周的数据,其中0为日志值

Logger Name AGENT   ManagerName AGENT_ID    Week    Logs    MonthID         
Logger1     Agent1  Manager1    ID1         40      0       179
Logger1     Agent1  Manager1    ID1         41      0       179
Logger1     Agent1  Manager1    ID1         42      25      179
Logger1     Agent1  Manager1    ID1         43      0       179
Logger1     Agent1  Manager1    ID1         44      120     180
Logger1     Agent1  Manager1    ID1         45      11      180
Logger1     Agent1  Manager1    ID1         46      0       180
Logger1     Agent1  Manager1    ID1         47      0       180
Logger1     Agent1  Manager1    ID1         48      41      181
Logger1     Agent1  Manager1    ID1         49      223     181
Logger1     Agent1  Manager1    ID1         50      92      181

任何人都可以帮我创建一个查询来创建这个表,表1中将包含许多代理,但日志名称将是常量。

可能不需要周检查临时表这只是我以某种方式对某些方式进行检查的想法,如果表1中没有出现月份和周,则添加!

2 个答案:

答案 0 :(得分:1)

这是一个选项。查询查找代理和周的所有组合。并删除第一个表中已存在的周数。然后插入剩余数据

declare @t table ([Logger Name] varchar(100), AGENT varchar(100), ManagerName varchar(100), AGENT_ID varchar(100), Week int, Logs int, MonthID int)
insert into @t
values ('Logger1', 'Agent1', 'Manager1', 'ID1', 42, 25, 179)
    , ('Logger1', 'Agent1', 'Manager1', 'ID1', 44, 120, 180)
    , ('Logger1', 'Agent1', 'Manager1', 'ID1', 45, 11, 180)
    , ('Logger1', 'Agent1', 'Manager1', 'ID1', 48, 41, 181)
    , ('Logger1', 'Agent1', 'Manager1', 'ID1', 49, 223, 181)
    , ('Logger1', 'Agent1', 'Manager1', 'ID1', 50, 92, 181)

declare @q table (Week int, Month int)
insert into @q
values (40, 179), (41, 179)
    , (42, 179), (43, 179), (44, 180)
    , (45, 180), (46, 180), (47, 180)
    , (48, 181), (49, 181), (50, 181)

insert into @t
select
    distinct t.[Logger Name], t.AGENT, t.ManagerName, t.AGENT_ID, q.Week, 0, q.Month
from
    @t t
    cross join @q q
where
    not exists (
        select 1
        from
            @t f
        where
            f.AGENT = t.AGENT
            and f.Week = q.Week
            and f.MonthID = q.Month
    )

select * from @t
order by AGENT, Week

答案 1 :(得分:0)

使用cross join生成行,然后使用left join添加其他数据:

select l.*, w.*,
       coalesce(t1.logs, 0) as logs
from (select distinct LoggerName, Agent, ManagerName, AgentId
      from table1
     ) l cross join
     tempweeks w left join
     table1 t1
     on t1.LoggerName = l.LoggerName and t1.Agent = l.Agent and
        t1.ManagerName = l.ManagerName and t1.AgentId = l.AgentId and
        t1.week = w.week and t1.monthid = w.weekid;

您可以通过执行以下操作轻松将其转换为插入内容:

insert into table1 ( . . . )
    select . . ., 0 as logs
    from (select distinct LoggerName, Agent, ManagerName, AgentId
          from table1
         ) l cross join
         tempweeks w left join
         table1 t1
         on t1.LoggerName = l.LoggerName and t1.Agent = l.Agent and
            t1.ManagerName = l.ManagerName and t1.AgentId = l.AgentId and
            t1.week = w.week and t1.monthid = w.weekid
    where t1.LoggerName is null;