SQL将结果拆分为多个列
问题描述:
我想将表中的结果拆分为多列。 根据原始查询的结果,每一列都是一个月中的一天。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'
如何获得日列的休息吗?
答
为此,您需要使用动态数据透视查询。
在这样一个你需要提前提供天列表的非动态查询:
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
您正在使用什么数据库? – jpw 2014-10-10 19:33:04
看起来像SQL服务器。 – 2014-10-10 19:34:57
对不起,SQL Server Express 11.0.2100 – 2014-10-10 19:36:27