【问题标题】:SQL Insert Missing Rows with no MatchSQL 插入缺失的行但没有匹配
【发布时间】:2018-09-21 05:32:02
【问题描述】:

我有一个问题,我目前有 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 中不存在月份和周,则添加!

【问题讨论】:

  • 日历表。

标签: sql sql-server-2005


【解决方案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

【讨论】:

  • 干杯,这是一个快速响应,效果很好,我还是比较新的,所以我正在学习,可以跟随和适应这个。
【解决方案2】:

使用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;

【讨论】:

  • 我相信这也有效,但还没有机会测试,但有机会时会感谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
  • 1970-01-01
  • 2016-02-04
  • 2012-12-23
  • 2014-09-20
  • 2021-12-07
  • 2011-06-22
相关资源
最近更新 更多