[英]How to retrieve data from multiple daily tables in SQL Server
我是Microsoft SQL Server 2008的新手。我需要一些帮助来从多个具有相同列和相同数据类型的表中检索数据。
当前,我的数据库中有多个表,每个表都包含一天的数据。 例如,我有下表:
所有表都有相同的列,具有相同的数据类型,例如:
现在,可以使用单个查询从所有表中检索列。
我正在寻找的是获取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.