2011-08-24 64 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我只是無言以對。 –