2011-08-24 62 views
6

SELECT Name1, Name2, Value FROM mytable给了我以下结果集:SQL Server PIVOT也许?

 
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 

感谢,

+1

嗨@user!你使用的是什么DBMS? – jadarnel27

+0

A和B是常量的固定列表吗? – Neil

+0

@ jadarnel27 - 这个问题的标题有一个提示;) – Tony

回答

1

您可以使用PIVOT条款。您的查询可能是这样的:使用上述示例数据

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,这里有几个关于SO的答案。

SQL Server 2005 Pivot on Unknown Number of Columns

Pivot Table and Concatenate Columns

+0

问题在于,OP不能将输出限制在A,B中。也可能有C,...,X,正如他在其中一条评论中所述。 –

+0

我做了一些修改,并能够通过使用此示例和http://stackoverflow.com/questions/159456/pivot-table-and-concatenate-columns-sql-problem#159803来获得它的工作。最后一件事,我将如何去替换另一个String的NULL值。我尝试了一个CASE,但它只替换了具有值的'Value'字段,而不是NULL – user683302

+0

我使用CASE更新了上面的PIVOT查询,并将NUll值更改为字符串。 – Taryn

4

我没有SQL服务器在工作运行的这里,所以这可能不是通过完全syntatically正确的,但一个方法是交叉表

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, '[email protected]+' FROM table GROUP BY name2' 

EXEC(@sql) 
+3

Tisk,tisk ...在工作中回答SO问题=) – jadarnel27

+0

我正在等待我的代码编译:-P – Zugwalt

+2

有很多[更具建设性](http:// xkcd.com/303/)当你的代码正在编译时,你可以做的事情;)当我在工作时,我发布了这个评论以及haha – jadarnel27

11

由于使用的是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动态地组装一个查询。您可以通过动态列来执行PIVOT的唯一方法是动态组装查询,这可以在SQL Server中完成。

其他例子:

+2

+1 QuoteName' –

+0

@Martin它避免了注入攻击! –

+1

+1我只是无言以对。 –