转置一张桌子

时间:2010-08-12 10:08:30

标签: sql sql-server tsql dynamic-pivot

嗨,我想旋转一张完整的表格:

LANGUAGE litAccept litDelete litErrorMsg  ..............
-------------------------------------------------
SPANISH  Accept    Delete    Error has ocurred
ENGLISH  Aceptar   Borrar    Ha ocurrido un error
.....

这样的事情:

LANGUAGE     ENGLISH   SPANISH
---------------------------------------
litAccept    Accept    Aceptar    
litDelete    Aceptar   Borrar    
litErrorMsg  Error..   Ha ocurridO..
...

我看到PIVOT你可以旋转一张桌子,但我不知道是谁做的!

请帮忙,谢谢

3 个答案:

答案 0 :(得分:1)

http://www.simple-talk.com/community/blogs/andras/archive/2007/09/14/37265.aspx

Pivot不能做'动态'所以你必须使用这个方法

答案 1 :(得分:1)

哇我已经做到了!!

现在我明白了PIVOT是如何运作的。我尝试使用动态SQL一次旋转整个表,并且无法将其放入pivot的语法中。旋转必须逐列(PIVOT)或逐行(UNPIVOT)将它们插入临时表中,以便在结尾处进行完整的移调。

我认为这是我的方式..但也许它可以在单个查询中完成? (UNION ALL无效,你知道; P)

第二天,我将编写我找到的解决方案。

谢谢!

答案 2 :(得分:0)

可以使用动态SQL同时使用UNPIVOTPIVOT来完成此操作。

DECLARE @colsUnPivot AS NVARCHAR(MAX),
    @colsPivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @colsUnPivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('t') and
               C.name like 'lit%'
         for xml path('')), 1, 1, '')

SET @colsPivot = STUFF((SELECT distinct ',' + QUOTENAME(c.Language) 
            FROM t c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 
            'SELECT * from 
            (
                select Language l1, type language, value
                from t
                unpivot
                (
                    value
                    for type in (' + @colsUnPivot + ')
                ) upvt
            ) x
            pivot 
            (
                min(value)
                for l1 in (' + @colsPivot + ')
            ) p '


execute(@query)

请参阅SQL Fiddle with a Demo