我需要一个查询,它提供所有表名和每天插入的记录数

时间:2017-09-17 12:46:49

标签: sql sql-server

我有30个表,如a,b,c,.. d1,列名是id,name,更新时间。列名称有所不同,但更新的时间列对于所有表都是通用的。有人可以帮我解决上述问题吗?

2 个答案:

答案 0 :(得分:1)

您可以使用公共特定列动态检索所有表(updated_time,我假设这是DATETIME数据类型列),并显示每个表的每个日期的记录数

USE TESTDB --use the schema where your tables are
GO

DECLARE @nSQL NVARCHAR(MAX)

SELECT @nSQL = COALESCE(@nSQL + 'UNION ALL ' + CHAR(10), '') +
               'SELECT ''' + TABLE_NAME + ''' AS TableName, 
                        CAST(updated_time AS DATE) [date],
                        COALESCE(COUNT(*),0) cnt                         
                  FROM ' + QUOTENAME(TABLE_NAME) + CHAR(10) +
               ' GROUP BY CAST(updated_time AS DATE) '
  FROM INFORMATION_SCHEMA.COLUMNS
 WHERE COLUMN_NAME = 'updated_time'

EXECUTE(@nSQL);

示例数据

CREATE TABLE t_tab1 (id INT, fname VARCHAR(10), updated_time DATETIME);
CREATE TABLE t_tab2 (id INT, lname VARCHAR(10), updated_time DATETIME);
CREATE TABLE t_tab3 (id INT, mname VARCHAR(10), updated_time DATETIME);
CREATE TABLE t_tab4 (id INT, addr VARCHAR(10), updated_time DATETIME);

INSERT INTO t_tab1 VALUES(1,'aaa',CAST('09/17/2017' AS DATE));
INSERT INTO t_tab1 VALUES(2,'bbb',CAST('09/17/2017' AS DATE));
INSERT INTO t_tab1 VALUES(1,'aaa',CAST('09/18/2017' AS DATE));
INSERT INTO t_tab1 VALUES(2,'bbb',CAST('09/18/2017' AS DATE));
INSERT INTO t_tab1 VALUES(3,'ccc',CAST('09/18/2017' AS DATE));
INSERT INTO t_tab2 VALUES(1,'aaa',CAST('09/18/2017' AS DATE));
INSERT INTO t_tab2 VALUES(2,'bbb',CAST('09/18/2017' AS DATE));
INSERT INTO t_tab3 VALUES(1,'ccc',CAST('09/18/2017' AS DATE));
INSERT INTO t_tab3 VALUES(2,'aaa',CAST('09/18/2017' AS DATE));
INSERT INTO t_tab3 VALUES(3,'bbb',CAST('09/18/2017' AS DATE));
INSERT INTO t_tab3 VALUES(4,'ccc',CAST('09/18/2017' AS DATE));
INSERT INTO t_tab4 VALUES(1,'aaa',CAST('09/18/2017' AS DATE));
INSERT INTO t_tab4 VALUES(2,'bbb',CAST('09/18/2017' AS DATE));

结果

TableName   date        cnt
t_tab1      2017-09-17  2
t_tab1      2017-09-18  3
t_tab2      2017-09-18  2
t_tab3      2017-09-18  4
t_tab4      2017-09-18  2

当然,您始终可以编辑查询以显示所需的记录。

答案 1 :(得分:0)

您可以将所有表联合在一起,然后在更新时间列上进行聚合,例如

SELECT
    t.updated,
    COUNT(*) AS cnt
FROM
(
    SELECT updated FROM a
    UNION ALL
    SELECT updated FROM b
    UNION ALL
    SELECT updated FROM b
    UNION ALL
    ...
) t
GROUP BY t.updated;