SELECT Name1, Name2, Value FROM mytable
这个语句返回的结果如下:
Name1 Name2 Value A P1 1 A P2 1 A P3 2 B P1 3 B P2 1 B P4 1要将其转换为以下格式:
A B P1 1 4 P2 1 1 P3 2 null P4 null 1谢谢。
SELECT Name1, Name2, Value FROM mytable
这个语句返回的结果如下:
Name1 Name2 Value A P1 1 A P2 1 A P3 2 B P1 3 B P2 1 B P4 1要将其转换为以下格式:
A B P1 1 4 P2 1 1 P3 2 null P4 null 1谢谢。
由于您正在使用 SQL Server 2005,这里是代码:
DECLARE @cols VARCHAR(1000)
DECLARE @sqlquery VARCHAR(2000)
SELECT @cols = STUFF(( SELECT distinct ',' + QuoteName([Name1])
FROM myTable FOR XML PATH('') ), 1, 1, '')
SET @sqlquery = 'SELECT * FROM
(SELECT Name2, Name1, Value
FROM myTable ) base
PIVOT (Sum(Value) FOR [Name1]
IN (' + @cols + ')) AS finalpivot'
EXECUTE ( @sqlquery )
无论你有多少不同的状态,这都能起作用。它使用PIVOT
动态组装查询。在SQL Server中,唯一能够使用动态列进行PIVOT的方法是通过动态地组装查询语句来实现。我在工作中没有运行 SQL Server,所以这可能不是完全正确的语法,但一种方法是交叉表。
SELECT name2
, SUM(CASE WHEN name1 = 'A' THEN value END) AS A
, SUM(CASE WHEN name1 = 'B' THEN value END) AS B
FROM table
GROUP BY name2
对于可变数量的列,您可以使用动态SQL:
DECLARE @sql varchar(max)
SELECT @sql = COALESCE(@sql+',','') + 'SUM(CASE WHEN nane1 = '''+name1+''' THEN value END) AS ['+name1']' FROM table
SET @sql = 'SELECT name2, '+@sql+' FROM table GROUP BY name2'
EXEC(@sql)
WITH Source as (
SELECT Name1, Name2, [Value]
FROM mytable
)
SELECT Name2, CASE WHEN A IS NOT NULL THEN A ELSE 'your string' END As A
, CASE WHEN B IS NOT NULL THEN B ELSE 'your string' END As B
FROM (
SELECT Name2, Name1, [Value]
FROM Source
) s
PIVOT
(
MAX([Value]) FOR Name1 IN (A, B) -- any other Name1 would go here
) p
P1 1 3
P2 1 1
P3 2 your string
P4 your string 1
编辑:
由于您有未知数量的列,您需要考虑使用动态SQL,并且这里有几个关于PIVOT的SO答案。
PIVOT
并不意味着他们知道它只在2005+版本中可用。很多人在使用SQL Server 2000时会问“如何旋转这个?” :-) - Aaron BertrandA
和B
之外的其他值。另外,当存在两行如下的情况时会发生什么:A,P1,1
和A,P1,4
?详细说明表格上的唯一约束条件将有助于其他人确定必要的聚合方式。 - Aaron Bertrand