如何从SQL Server

时间:2016-08-04 12:40:52

标签: sql sql-server sql-server-2008

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

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

  • Table_20160820
  • Table_20160821
  • Table_20160822
  • Table_20160823
  • Table_20160824
  • Table_20160825

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

  • COLUMN_1
  • COLUMN_2
  • column_3
  • column_4

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

我正在寻找的是得到column_3的计数,对于所有表,它将按column_1分组。我想避免编写多个查询,因为我需要获取整个月的数据,即30个表。

3 个答案:

答案 0 :(得分:1)

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

要将所有数据放在一起,请将UNION运算符与insert语句结合使用到新的更好的表中。

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 current state中执行此操作。它看起来像这样:

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

只需将其扩展到您需要抓取的表格。

答案 1 :(得分:0)

您可以使用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 

答案 2 :(得分:0)

如上所述,这是一个糟糕的设计,如果设计在第一时间固定就会很好。这是技术债务,必须迟早收回。无论如何,这是你如何做到的:

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

print语句的输出将类似于 -

 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