【问题标题】:how to create pivot query for this result?如何为此结果创建数据透视查询?
【发布时间】:2015-02-24 18:51:08
【问题描述】:

我得到了查询的结果:

TITAL   PCS RGH_CTS    VALUE
-----   --- -------    ------------ 
SEND    10  49.8550    198742.94400
BID     15  76.7070    327461.76300
FINAL   19  88.5630    337954.15600

我想要这个输出 - 如何解决这个问题?

| TITAL     |    SEND      |    BID       |   FINAL      |
----------------------------------------------------------
| PCS       |     10       |    15        |     19       |
| RGH_CTS   |   49.8550    |  76.7070     |   88.5630    |
| VALUE     | 198742.94400 | 327461.76300 | 337954.15600 |

任何机构都可以解决这个简单的查询?

【问题讨论】:

    标签: sql sql-server sql-server-2008 sql-server-2005 pivot


    【解决方案1】:

    你需要结合PivotUnpivot来得到结果。

    首先Unpivot 使用Cross Apply 获取表中的单列数据。

    下一步Pivot上一步的结果得到结果。

    SELECT Tital, 
           [SEND],
           [BID],
           [FINAL]
    FROM   (SELECT t.TITAL AS tt,
                   c.TITAL,
                   cdata
            FROM   Tablename t
                   CROSS apply ( VALUES ('PCS',[PCS]),
                                        ('RGH_CTS',[RGH_CTS]),
                                        ('VALUE',VALUE) ) c (TITAL, cdata)) a
           PIVOT (Max(cdata)
                 FOR tt IN([SEND],
                           [BID],
                           [FINAL])) piv 
    

    SQLFIDDLE DEMO

    【讨论】:

    • 谢谢。它非常有用全年的建议。我得到了我的结果..但在你的查询中我无法理解如何从表中使用'cdata'。你能解释一下吗?
    【解决方案2】:

    根据 NoDisplayName,您需要先进行完整的转置,方法是先 UNPIVOT ing,然后重新 PIVOTing 数据。也可以使用同名关键字UNPIVOT数据:

    SELECT Criteria as TITAL, [SEND], [BID], [FINAL]
    FROM
    (
        SELECT 
            *
        FROM 
            Result
        UNPIVOT 
        (
           SomeColumn
           for Criteria in (PCS, RGH_CTS, VALUE)
        ) unpvt
    
    ) X
    PIVOT
    (
       SUM(SomeColumn)
       for [TITAL] IN ([SEND], [BID], [FINAL])
    )pvt;
    

    请注意,在转置后保留 LHS 列名是相当不寻常的(即TITAL 似乎在转置前后的数据中完全指代不同的主题)?

    SqlFiddle here

    【讨论】:

    • 查询看起来不错只是一个小建议,如果 PCSRGH_CTS 的数据类型不同,这将不起作用。如果 PCS 是 Int 且 RGH_CTS 是数字,那么您可能会得到 type conflict in unpivot list。检查这个sqlfiddle.com/#!6/55a8f/2
    • 是的,很好,在这种情况下,未透视的数据需要存储在最低公分母 (DECIMAL) 中,然后在最终的 rePIVOT 中重新转换回 INT。
    • 是的,这就是想法:)
    【解决方案3】:

    由于您使用的是 SQL Server 2005+,因此您可以使用 PIVOT/UNPIVOT

    编辑:我在他编辑问题之前发布了这个,让它更清楚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多