【问题标题】:transposing a table转置表格
【发布时间】:2010-08-12 10:08:29
【问题描述】:

您好,我想旋转一张完整的桌子:

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 可以旋转桌子,但我不知道是谁做的!

请帮忙,谢谢

【问题讨论】:

  • 你看过sql server在线书籍吗?
  • Pivot 不直接执行此操作。也许您可以先使用unpivot,然后尝试使用pivot 以任何格式将其恢复。我对你在SPANISH 行中的AcceptDelete 开始的数据有点困惑(这似乎是错误的开始)。然后在改造后的版本中Delete已经完全消失了。
  • 是的,这是一个错误!将第二行中的“Aceptar”替换为“删除”

标签: sql sql-server tsql dynamic-pivot


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    哇,我做到了!

    现在我了解 PIVOT 的工作原理。我尝试使用动态 SQL 一次旋转整个表,但无法将其放入 pivot 的语法中。旋转必须逐列 (PIVOT) 或逐行 (UNPIVOT) 完成,将它们插入临时表中以在最后获得完整的转置。

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

    第二天我会写出我找到的解决方案。

    谢谢!

    【讨论】:

    • 您应该能够在单个查询中使用 pivot 和 unpivot,而不是创建一个临时表,将 unpivot 的输出作为 pivot 的输入。
    • 行数和列数是动态的怎么办?
    【解决方案3】:

    这可以使用带有UNPIVOTPIVOT 的动态SQL 来完成。

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 1970-01-01
      • 2022-12-16
      • 2014-08-04
      • 1970-01-01
      • 1970-01-01
      • 2016-05-06
      相关资源
      最近更新 更多