Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql server将数据动态插入表中_Sql_Sql Server_Sql Insert - Fatal编程技术网

sql server将数据动态插入表中

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

我有一个表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        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 ;