将行查询成列
Query with rows into columns
我在 tbl1 中有数据:
item date amount
a 1 10
a 2 20
a 3 30
a 4 40
b 1 20
b 2 30
b 3 40
b 4 50
c 1 30
c 2 40
c 3 50
c 4 60
但我需要像下面这样
item 1 2 3 4
a 10 20 30 40
b 20 30 40 50
c 30 40 50 60
使用PIVOT
SELECT item, [1], [2], [3], [4]
FROM tbl1 t
PIVOT (SUM(amount) FOR date IN ([1], [2], [3], [4])) p
SELECT item, [10], [20], [30], [40], [50], [60]
FROM tbl1 t
PIVOT (MAX(date) FOR amount IN ([10], [20], [30], [40], [50], [60])) p
输出:
item 1 2 3 4
a 10 20 30 40
b 20 30 40 50
c 30 40 50 60
SQL Fiddle: http://sqlfiddle.com/#!3/f097d/12/0
您可以像这样使用 CASE
将 GROUP BY
与条件聚合一起使用。
示例数据
DECLARE @tbl1 TABLE (item CHAR(1),date int, amount int)
INSERT INTO @tbl1 VALUES
('a', 1, 10),
('a', 2, 20),
('a', 3, 30),
('a', 4, 40),
('b', 1, 20),
('b', 2, 30),
('b', 3, 40),
('b', 4, 50),
('c', 1, 30),
('c', 2, 40),
('c', 3, 50),
('c', 4, 60);
查询
SELECT
item,
MAX(CASE WHEN date = 1 then amount END) as d1,
MAX(CASE WHEN date = 2 then amount END) as d2,
MAX(CASE WHEN date = 3 then amount END) as d3,
MAX(CASE WHEN date = 4 then amount END) as d4
FROM @tbl1
GROUP BY item
输出
item d1 d2 d3 d4
a 10 20 30 40
b 20 30 40 50
c 30 40 50 60
编辑
如果你有未知数的日期,那么使用 dynamic pivot
像这样。
DECLARE @s NVARCHAR(MAX)
SELECT @s = STUFF((SELECT DISTINCT ',' + quotename(CONVERT(VARCHAR(10),date),'[')
FROM #tbl1 for xml path('')),1,1,'')
SET @s = N'SELECT item,' + @s + ' FROM #tbl1 PIVOT(MAX(amount) FOR date in(' + @s + ')) as pvt'
print @s
EXEC sp_executeSQL @s
使用PIVOT
使用数据透视概念将行值转换为列 header
PIVOT
是 Sql Server 2005 中引入的新关系运算符之一。它在 Sql Server 中提供了一种将行转换为列的简单机制。
select * from tbl1 pivot(sum(amount) for [date] in([1],[2],[3],[4])) as a
我在 tbl1 中有数据:
item date amount
a 1 10
a 2 20
a 3 30
a 4 40
b 1 20
b 2 30
b 3 40
b 4 50
c 1 30
c 2 40
c 3 50
c 4 60
但我需要像下面这样
item 1 2 3 4
a 10 20 30 40
b 20 30 40 50
c 30 40 50 60
使用PIVOT
SELECT item, [1], [2], [3], [4]
FROM tbl1 t
PIVOT (SUM(amount) FOR date IN ([1], [2], [3], [4])) p
SELECT item, [10], [20], [30], [40], [50], [60]
FROM tbl1 t
PIVOT (MAX(date) FOR amount IN ([10], [20], [30], [40], [50], [60])) p
输出:
item 1 2 3 4
a 10 20 30 40
b 20 30 40 50
c 30 40 50 60
SQL Fiddle: http://sqlfiddle.com/#!3/f097d/12/0
您可以像这样使用 CASE
将 GROUP BY
与条件聚合一起使用。
示例数据
DECLARE @tbl1 TABLE (item CHAR(1),date int, amount int)
INSERT INTO @tbl1 VALUES
('a', 1, 10),
('a', 2, 20),
('a', 3, 30),
('a', 4, 40),
('b', 1, 20),
('b', 2, 30),
('b', 3, 40),
('b', 4, 50),
('c', 1, 30),
('c', 2, 40),
('c', 3, 50),
('c', 4, 60);
查询
SELECT
item,
MAX(CASE WHEN date = 1 then amount END) as d1,
MAX(CASE WHEN date = 2 then amount END) as d2,
MAX(CASE WHEN date = 3 then amount END) as d3,
MAX(CASE WHEN date = 4 then amount END) as d4
FROM @tbl1
GROUP BY item
输出
item d1 d2 d3 d4
a 10 20 30 40
b 20 30 40 50
c 30 40 50 60
编辑
如果你有未知数的日期,那么使用 dynamic pivot
像这样。
DECLARE @s NVARCHAR(MAX)
SELECT @s = STUFF((SELECT DISTINCT ',' + quotename(CONVERT(VARCHAR(10),date),'[')
FROM #tbl1 for xml path('')),1,1,'')
SET @s = N'SELECT item,' + @s + ' FROM #tbl1 PIVOT(MAX(amount) FOR date in(' + @s + ')) as pvt'
print @s
EXEC sp_executeSQL @s
使用PIVOT
使用数据透视概念将行值转换为列 header
PIVOT
是 Sql Server 2005 中引入的新关系运算符之一。它在 Sql Server 中提供了一种将行转换为列的简单机制。
select * from tbl1 pivot(sum(amount) for [date] in([1],[2],[3],[4])) as a