Sql 将行查询为列

Sql 将行查询为列,sql,sql-server,sql-server-2008,pivot,Sql,Sql Server,Sql Server 2008,Pivot,我有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

我有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:

您可以像这样使用
CASE
分组依据
与条件聚合一起使用

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
样本数据

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
编辑 如果您有未知的日期数,请像这样使用
动态透视

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

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
使用透视概念将行值转换为列标题

PIVOT
是SQLServer2005中引入的新关系运算符之一。它在SQLServer中提供了一种将行转换为列的简单机制

select * from tbl1 pivot(sum(amount) for [date] in([1],[2],[3],[4])) as a

你需要什么帮助?什么不起作用?你试过什么?我不知道怎么做,请我需要那个表的sql查询。亲爱的先生,现在还不知道有多少日期。在中搜索动态轴,你会得到很多关于它的例子亲爱的先生,我想在图表中显示一个x轴和d1,d2ato dn作为y轴,请帮助。在C#windows窗体中。亲爱的先生,有多少日期是未知的。然后您需要用这个创建一个动态轴心