2013-06-20 78 views
1

對不起,如果我不清楚。這是我有:SQL:交叉表查詢將列名轉換爲行

Table A

這是我想達到的目標:

Table B

基本上,而不必爲每個項目一欄,我希望把所有的一列中的項目稱爲代碼。這將爆炸我擁有的行數,因爲每個項目有3個或更多不同的比率(並且所有百分比也都在比率列下)。我知道如何將行轉換爲列,反之亦然,但爲此,我有點迷路。任何幫助表示感謝。

回答

0

假設你使用SQL服務器(在你的問題標籤是混亂的,因爲你有MySQL和SQL服務器),如果代碼的數量是有限的,並事先知道只使用UNPIVOT

SELECT Type, Code, Ratio 
    FROM 
( 
    SELECT Type, HRE, HRF, HRM 
    FROM TableA 
) s 
UNPIVOT 
( 
    Ratio FOR Code IN (HRE, HRF, HRM) 
) u 

這是現在SQLFiddle

如果代碼的數量沒有事先或者只是想知道動態做到這一點,你可以使用動態SQL

DECLARE @cols NVARCHAR(MAX), @sql NVARCHAR(MAX) 

SET @cols = STUFF(
(
    SELECT DISTINCT ',' + QUOTENAME(name) 
    FROM sys.columns 
    WHERE object_id = object_id('TableA') 
    AND name LIKE 'H__' 
     FOR XML PATH(''), TYPE 
).value('.', 'NVARCHAR(MAX)'), 1, 1, '') 

SET @sql = 
'SELECT Type, Code, Ratio 
    FROM 
( 
    SELECT Type, ' + @cols + 
' FROM TableA 
) s 
UNPIVOT 
( 
    Ratio FOR Code IN (' + @cols + ') 
) u' 

EXECUTE(@sql) 

這裏是SQLFiddle

+0

@rustynails有沒有幫助?你的問題需要更多幫助嗎? – peterm

+0

你是巨大的幫助。我不敢相信我沒有回覆。謝謝你,先生。 – rustynails