繁体   English   中英

如何从SQL Server中的多个每日表中检索数据

[英]How to retrieve data from multiple daily tables in SQL Server

我是Microsoft SQL Server 2008的新手。我需要一些帮助来从多个具有相同列和相同数据类型的表中检索数据。

当前,我的数据库中有多个表,每个表都包含一天的数据。 例如,我有下表:

  • 表_20160820
  • 表_20160821
  • 表_20160822
  • 表_20160823
  • 表_20160824
  • 表_20160825

所有表都有相同的列,具有相同的数据类型,例如:

  • column_1
  • 栏_2
  • column_3
  • column_4

现在,可以使用单个查询从所有表中检索列。

我正在寻找的是获取column_3的计数,该计数将按所有表的column_1分组。 我想避免编写多个查询,因为我需要从30个表中获取一个月的数据。

正如评论所言,最好将其组织到一个表中,然后添加一个日期列,以便查看何时添加了每一行。 您甚至可以将date_created列的默认值设置为getdate()

为了将所有数据汇总在一起,请结合使用UNION运算符和对新的更好表格的插入语句。

CREATE TABLE Better_Table (Column_1 <type>, Column_2 <type>, ..., Date_Created DateTime2(7) Default GETDATE())
GO
INSERT INTO Better_Table (Column_1, Column_2, ...)
SELECT *, '2016/08/22' FROM Table_20160822
UNION
SELECT *, '2016/08/23' FROM Table_20160823
...

完成此操作后,您的查询将变得更加简单:

SELECT Column_1, COUNT(Column_3)
FROM Better_Table
WHERE date_created >= '2016/08/01'
AND date_created < '2016/09/01'
GROUP BY Column_1

尽管您仍然可以通过使用group by查询中的union运算符在db当前状态下执行此操作。 它看起来像这样:

SELECT a.column_1, COUNT(a.column_3)
FROM ( 
SELECT column_1, Column_3
FROM Table_20160822
UNION ALL
SELECT column_1, Column_3
FROM Table_20160823
) a
GROUP BY a.Column_1

只需将其扩展到您需要获取的表即可。

您可以使用CTE获取所需的所有日期,然后创建查询并执行它:

DECLARE @dateStart datetime = '2016-08-01',
        @dateFinish datetime = '2016-09-01',
        @query nvarchar(max)

;WITH cte as (
SELECT  @dateStart as d
UNION ALL
SELECT DATEADD(day,1,d)
FROM cte
WHERE DATEADD(day,1,d) < @dateFinish
)

SELECT @query = (

    SELECT 'SELECT column_1, COUNT(column_3) FROM ( '
    + STUFF((
    SELECT  ' UNION ALL SELECT * FROM [Table_'+CONVERT(nvarchar(8),d,112)+'] '
    FROM cte
    FOR XML PATH('')
    ),1,10,'') + ') as t GROUP BY column_1 '
    FOR XML PATH('')
)

PRINT @query

EXEC sp_executesql @query

@query变量的输出:

SELECT column_1, COUNT(column_3) 
FROM (  
    SELECT * FROM [Table_20160801]  UNION ALL 
    SELECT * FROM [Table_20160802]  UNION ALL 
    SELECT * FROM [Table_20160803]  UNION ALL 
    SELECT * FROM [Table_20160804]  UNION ALL 
    ....
    SELECT * FROM [Table_20160831] 
) as t
GROUP BY column_1 

如上所述,这是一个糟糕的设计,如果将设计固定在第一位会很好。 这是技术债务,迟早必须偿还。 无论如何,这是您可以执行的操作:

DECLARE @dtStartDate        DATE,
        @dtEndDate          DATE,
        @nvchTablePrefix    NVARCHAR(50),
        @nvchQuery          NVARCHAR(max)


SELECT  @dtStartDate = '20160801', 
        @dtEndDate = '20160831',
        @nvchTablePrefix = 'Table_'


CREATE TABLE #temp
(name NVARCHAR(100))

WHILE(@dtStartDate <= @dtEndDate)
BEGIN
INSERT INTO #temp
SELECT  ' SELECT column_1, column_3 FROM ' + @nvchTablePrefix +    CONVERT(NVARCHAR,@dtStartDate,112)

SELECT @dtStartDate = DATEADD(d,1,@dtStartDate)

IF (@dtStartDate <= @dtEndDate)
INSERT INTO #temp
SELECT  ' UNION '
END



SELECT @nvchQuery = 'SELECT column_1, COUNT(column_3) as column3count FROM ( '

SELECT @nvchQuery = @nvchQuery + name FROM #temp

SELECT @nvchQuery = @nvchQuery + ') t GROUP BY column1'



PRINT @nvchQuery
EXEC sp_executesql @nvchQuery


DROP TABLE #temp

打印语句的输出将类似于-

 SELECT column_1, COUNT(column_3) as column3count 
 FROM 
 (   SELECT column_1, column_3 FROM Table_20160801 
     UNION  
     SELECT column_1, column_3 FROM Table_20160802 
     UNION  
     .... 
     UNION  
     SELECT column_1, column_3 FROM Table_20160831
 ) t GROUP BY column1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM