2014-10-10 190 views
0

我想将表中的结果拆分为多列。 根据原始查询的结果,每一列都是一个月中的一天。SQL将结果拆分为多个列

所以考虑下表:

VALUE | TIMESTAMP 
1  | 2014-10-01 00:00:00 
22  | 2014-10-01 12:00:00 
333  | 2014-10-02 00:00:00 
2000  | 2014-10-02 12:00:00 
55  | 2014-10-03 00:00:00 
11  | 2014-10-03 12:00:00 

我想达到的结果,其中,第一列表示时间,每个后续列是月(从1到31)的日

因此,像这样:

Time  | Day1 | Day2 | Day3 | ...... 
00:00:00 | 1 | 333 | 55 | ...... 
12:00:00 | 22 | 2000 | 11 | ...... 

我能够实现一天,例如Day1

Time  | Day1 
00:00:00 | 1 
12:00:00 | 22 

SELECT cast(TIMESTAMP as time) [time], VALUE as Day1 
FROM TABLE1 
WHERE TIMESTAMP>='2014-10-01' and TIMESTAMP<='2014-10-02' 

如何获得日列的休息吗?

+2

您正在使用什么数据库? – jpw 2014-10-10 19:33:04

+0

看起来像SQL服务器。 – 2014-10-10 19:34:57

+0

对不起,SQL Server Express 11.0.2100 – 2014-10-10 19:36:27

回答

0

为此,您需要使用动态数据透视查询。

在这样一个你需要提前提供天列表的非动态查询:

SELECT 
    [Time], [Day 1],[Day 2],[Day 3] 
FROM (
    SELECT 
    VALUE, 
    LEFT(CAST(TIMESTAMP AS TIME),5) [TIME], 
    CONCAT('Day ', DAY(TIMESTAMP)) D 
    FROM TABLE1 
) AS Source 
PIVOT (SUM(Value) FOR D IN ([Day 1],[Day 2],[Day 3]) 
) AS Pivoted 

但与你建立天榜第一,然后将其注入到一个动态查询模型查询:

DECLARE @sql AS NVARCHAR(MAX) 
DECLARE @cols AS NVARCHAR(MAX) 

SELECT @cols= ISNULL(@cols + ',','') + QUOTENAME(CONCAT('Day ', D)) 
FROM (SELECT DISTINCT DAY(TIMESTAMP) D FROM Table1) AS Days 

SET @sql = 
    N'SELECT [Time], ' + @cols + ' 
    FROM (
    SELECT 
     VALUE, 
     LEFT(CAST(TIMESTAMP AS TIME),5) [TIME], 
     CONCAT(''Day '', DAY(TIMESTAMP)) D 
    FROM TABLE1 
    ) AS Source 
    PIVOT(SUM(Value) 
      FOR D IN (' + @cols + ')) AS Pivoted' 

EXEC sp_executesql @sql 

注意查询上述不确保天都同年/月之内,你应该添加一个检查为,或限制查询到某一个月/年。

结果:

Time Day 1  Day 2  Day 3 
----- ----------- ----------- ----------- 
00:00 1   333   55 
12:00 22   2000  11 

Sample SQL Fiddle