sql server将数据动态插入表中
我有一个表a,其中有过去30天的员工呼叫计数。但是,如果该员工在过去30天内没有电话,它将不会显示在此表中。如果员工列表在表B中,如何将这些员工插入此表sql server将数据动态插入表中,sql,sql-server,sql-insert,Sql,Sql Server,Sql Insert,我有一个表a,其中有过去30天的员工呼叫计数。但是,如果该员工在过去30天内没有电话,它将不会显示在此表中。如果员工列表在表B中,如何将这些员工插入此表 Table A: Employee Date Call_count Jim 20180224 10 Jim 20180223 10 Jim 20180222 10 .... Jock 20180224 12 Jock 20180223 12 Jock
Table A:
Employee Date Call_count
Jim 20180224 10
Jim 20180223 10
Jim 20180222 10
....
Jock 20180224 12
Jock 20180223 12
Jock 20180222 101
...
表B只有员工姓名:
Employee
Jim
Jock
Ann
预期结果显示安是一个没有电话的人:
Employee Date Call_count
Jim 20180224 10
Jim 20180223 10
Jim 20180222 10
....
Jock 20180224 12
Jock 20180223 12
Jock 20180222 101
...
Ann 20180224 0
Ann 20180223 0
Ann 20180222 0
使用insert with Filter子句。如果您有任何id列,而不是查看name列,那么这将更加准确
您可以这样尝试:
Insert into table A (employee,date,call_count)
Select employee,date,call_count from table B where isnull(call_count,0)<>0
如果您有一个日历表,那么这将成为一个非常基本的查询:
SELECT b.Employee,
c.Date,
Call_count = ISNULL(a.Call_count, 0)
FROM dbo.Calendar AS c
CROSS JOIN dbo.TableB AS b
LEFT JOIN dbo.TableA AS a
ON a.Date = c.[Date]
AND a.Employee = b.Employee
WHERE c.Date >= DATEADD(DAY, -30, CAST(GETDATE() AS DATE))
AND c.Date < GETDATE();
这里有三个步骤
用于创建一组6行和一组6行,并交叉连接它们以获得30行。
用于为每行创建顺序id。
从今天的日期中减去这个数字,得到最近30天的列表。
现在,您可以将此集合替换为上面的查询,以代替calenar表:
WITH Calendar AS
( SELECT Date = DATEADD(DAY, -ROW_NUMBER() OVER(ORDER BY n1.n), CONVERT(DATE, GETDATE()))
FROM (VALUES (1),(1),(1),(1),(1),(1)) n1 (n)
CROSS JOIN (VALUES (1),(1),(1),(1),(1)) n2 (n)
)
SELECT b.Employee,
c.Date,
Call_count = ISNULL(a.Call_count, 0)
FROM Calendar AS c
CROSS JOIN dbo.TableB AS b
LEFT JOIN dbo.TableA AS a
ON a.Date = c.[Date]
AND a.Employee = b.Employee ;
您是否尝试过使用insert into table?您是如何构造表A的?这不是某个查询的结果吗?谢谢,但表B只有员工姓名,没有任何其他数据谢谢,但表B只有员工姓名,没有任何其他数据
SELECT Date = DATEADD(DAY, -ROW_NUMBER() OVER(ORDER BY n1.n), CONVERT(DATE, GETDATE()))
FROM (VALUES (1),(1),(1),(1),(1),(1)) n1 (n)
CROSS JOIN (VALUES (1),(1),(1),(1),(1)) n2 (n);
WITH Calendar AS
( SELECT Date = DATEADD(DAY, -ROW_NUMBER() OVER(ORDER BY n1.n), CONVERT(DATE, GETDATE()))
FROM (VALUES (1),(1),(1),(1),(1),(1)) n1 (n)
CROSS JOIN (VALUES (1),(1),(1),(1),(1)) n2 (n)
)
SELECT b.Employee,
c.Date,
Call_count = ISNULL(a.Call_count, 0)
FROM Calendar AS c
CROSS JOIN dbo.TableB AS b
LEFT JOIN dbo.TableA AS a
ON a.Date = c.[Date]
AND a.Employee = b.Employee ;