2014-10-27 81 views
0

我有一个查询,其结果集看起来像下表。
名称列有这是众所周知的没有聚合的SQL SERVER枢轴

Id | Name | Value 
------------------------------- 
1 | C1 | 1C1 
1 | C2 | 1C2 
1 | C3 | 1C3 
2 | C1 | 2C1 
2 | C2 | 2C2 
2 | C3 | 2C3 

我需要把它转以下

Id | C1 | C2 | C3 
------------------------------- 
1 | 1C1 | 1C2 | 1C3 
2 | 2C2 | 2C2 | 2C3 
一个“C1,C2,C3”集

试图与支点,但他们不来实现它对于字符串值(即非集合)看起来似乎不错。 任何关于如何去做这件事的指针?

+3

'MAX()'是一个总能与字符串的工作,有没有点在提供时,开发商碰巧知道,每个聚集只会收到一个特殊的设施行的价值。 – 2014-10-27 15:04:30

回答

1

此代码是相当多从SQL Server文档中的样品取出;子查询在这里并不是真的需要,但这就是它在样本中的写法。

SELECT * FROM (
    SELECT Id, Name, Value 
    FROM your_table_or_query 
    ) AS p 
PIVOT 
    (MAX(value) 
    FOR Name IN 
     (C1,C2,C3) 
) AS pvt 
ORDER BY ID; 

输出:

Id C1 C2 C3 
1 1C1 1C2 1C3 
2 2C1 2C2 2C3 
1

类似下面应该做的伎俩:

DECLARE @source TABLE (ID INT NOT NULL, 
         [Name] VARCHAR(20) NOT NULL, 
         [Value] VARCHAR(20) NOT NULL); 

INSERT INTO @source (ID, Name, Value) 
VALUES (1,'C1','1C1'), 
     (1,'C2','1C2'), 
     (1,'C3','1C3'), 
     (2,'C1','2C1'), 
     (2,'C2','2C2'), 
     (2,'C3','2C3'); 

SELECT ID, [C1], [C2], [C3] 
FROM @source 
PIVOT (MAX([Value]) FOR [Name] IN ([C1], [C2], [C3])) AS pivotTable;