将行查询成列

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

您可以像这样使用 CASEGROUP 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