2013-06-20 55 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