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
感謝,
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
感謝,
您可以使用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的答案。
問題在於,OP不能將輸出限制在A,B中。也可能有C,...,X,正如他在其中一條評論中所述。 –
我做了一些修改,並能夠通過使用此示例和http://stackoverflow.com/questions/159456/pivot-table-and-concatenate-columns-sql-problem#159803來獲得它的工作。最後一件事,我將如何去替換另一個String的NULL值。我嘗試了一個CASE,但它只替換了具有值的'Value'字段,而不是NULL – user683302
我使用CASE更新了上面的PIVOT查詢,並將NUll值更改爲字符串。 – Taryn
我沒有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)
Tisk,tisk ...在工作中回答SO問題=) – jadarnel27
我正在等待我的代碼編譯:-P – Zugwalt
有很多[更具建設性](http:// xkcd.com/303/)當你的代碼正在編譯時,你可以做的事情;)當我在工作時,我發佈了這個評論以及haha – jadarnel27
由於使用的是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中完成。
其他例子:
+1 QuoteName' –
@Martin它避免了注入攻擊! –
+1我只是無言以對。 –
嗨@user!你使用的是什麼DBMS? – jadarnel27
A和B是常量的固定列表嗎? – Neil
@ jadarnel27 - 這個問題的標題有一個提示;) – Tony