我有一个问题,我目前有一个表填充数据并按周汇总,不幸的是数据来自的表没有每个人每周的条目(很多原因),因此我想根据第一个临时表和周检查临时表
的结果创建一个表这是首次选择临时表
的结果表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中没有出现月份和周,则添加!
答案 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;