2014-10-10 224 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