【问题标题】:SQL Pivot Rows to ColumnSQL 数据透视行到列
【发布时间】:2016-04-15 04:41:57
【问题描述】:

以为这很容易,但我遇到了麻烦。我需要旋转(或取消旋转)一个包含 100,000 多行的表(称为 da_LMP_downloads)。我从这个开始:table_before

之前:

市场日 |节点|节点类型 | LMP_值| HE1 | HE2| HE 3|.......|HE24|

2012 年 10 月 1 日 |AEC|接口 | LMP | 17.82 | 16.44 | 16.45

2012 年 10 月 1 日 |AEC|接口 |中冶 | .14 | .16 | .62

2012 年 10 月 1 日 |AEC|接口 |多层板 | -.38 | -.34 | .34

但需要它在枢轴之后看起来像这样:table_after

之后:

Market_Day |节点 |他 |低脂蛋白 |达MCC |大MLC

2012 年 10 月 1 日 | AEC | 1 | 17.82 | .14 | -.38

2012 年 10 月 1 日 | AEC | 2| 16.44| .16 | -.34

2012 年 10 月 1 日 | AEC | 3 | 16.45 | .62 | .34

【问题讨论】:

  • 你的 RDBM 是什么?
  • 如果图像 AFTER 正确(6 列),这是一个 UNPIVOT(列成行)并且我们必须知道 dbms,因为语法因 dbms 供应商而异
  • 请在您的问题中添加一些示例数据(不是图像,只是文本)或设置 sqlfiddle (sqlfiddle.com)
  • 这是在 Excel 中使用的吗?为什么不使用数据透视表?
  • 抱歉耽搁了,我使用的是 SQL Server。 @waqasahmed 数据透视表不能满足我的需要。

标签: sql pivot rows large-data


【解决方案1】:

如果您的 dbms 是 SQL Server,那么您可以使用 CROSS APPLY 和 VALUES 来实现“反透视”部分,但您还需要一个小的“透视”操作,它会出现,并且 GROUP BY 将起作用。请注意,这仅适用于 SQL Server,其他数据库的 unpivot/pivot 语法非常不同。

/* input looks like this...
Market_Day Node Node_Type LMP_Value HE1   HE2   .... HE24
2012-10-01 AEC Interface  LMP       17.82 16.44 .... 19.77
*/
SELECT
      sq.Market_Day
    , sq.Node
    , sq.Node_Type
    , sq.HE
    , MAX(sq.daLMP) AS daLMP
    , MAX(sq.daMCC) AS daMCC
    , MAX(sq.daMLC) AS daMLC
FROM (
      SELECT
            t.Market_Day
          , t.Node
          , t.Node_Type
          , ca.HE
          , CASE WHEN LMP_Value = 'LMP' THEN ca.val END AS daLMP
          , CASE WHEN LMP_Value = 'MCC' THEN ca.val END AS daMCC
          , CASE WHEN LMP_Value = 'MLC' THEN ca.val END AS daMLC
      FROM Table1 t
            CROSS APPLY (
                  VALUES
                        (1, HE1)
                      , (2, HE2)
                      , (3, HE3)
                      , (4, HE4)
                      , (5, HE5)
                      , (6, HE6)
                      , (7, HE7)
                      , (8, HE8)
                      , (9, HE9)
                      , (10, HE10)
                      , (11, HE11)
                      , (12, HE12)
                      , (13, HE13)
                      , (14, HE14)
                      , (15, HE15)
                      , (16, HE16)
                      , (17, HE17)
                      , (18, HE18)
                      , (19, HE19)
                      , (20, HE20)
                      , (21, HE21)
                      , (22, HE22)
                      , (23, HE23)
                      , (24, HE24)
                        ) AS ca (HE, val)
    ) AS sq
GROUP BY
      sq.Market_Day
    , sq.Node
    , sq.Node_Type
    , sq.HE

注意 TSQL 实际上同时具有“pivot”和“unpivot”运算符,但我发现使用交叉应用/值更高效且更易于实现。

【讨论】:

  • 谢谢我明天试试这个代码。非常感谢。
  • 我想我可能做错了什么。我收到一些错误,例如无法绑定多部分标识符“t.Market_Day”。在您的代码中,我认为我用 Table1 代替了我的表名 DA_LMP_DOWNLOADS ?我错过了什么?感谢您的帮助@Used_By_Already
  • 不,这是我的错。在 TSQL 中,每个子查询 MUST 都有一个别名,我已经为包含交叉应用等的子查询提供了“sq”的别名,所以在顶部的 select 子句和最后的 group by 子句中,列应该是由该别名引用。对不起,我现在已经更正了。你可以选择一个不同的别名,我用“sq”来表示子查询
  • 明白了,这是有道理的。表 1 应该是我当前的表正确吗?我今晚会试试这个。非常感谢。
  • 是的,请输入您的真实表名而不是“table1”,但保留别名 t,它应该可以工作
猜你喜欢
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-27
  • 2021-01-21
  • 1970-01-01
  • 2019-03-08
  • 1970-01-01
相关资源
最近更新 更多