【问题标题】:SQL Server Trying to convert the data from rows to columnsSQL Server试图将数据从行转换为列
【发布时间】:2021-02-10 14:28:56
【问题描述】:

我有如下数据表

Crosswalk_id Code
ORG_201      1234
ORG_201      3456
ORG_201      3459
ORG_201      0983
ORG_201      2562
ORG_201      1239

需要转换成

Crosswalk_id   C1    C2   C3    C4    C5    C6
ORG_201       1234  3456  3459  0983  2562  1239

请帮助我使用 pivot 实现这一目标

【问题讨论】:

  • 如果你下次有七行,然后呢? Pivot 只能生成固定数量的列,除非您开始使用动态 sql - 即便如此,您也需要事先知道您需要多少列。
  • 什么也决定了数据的顺序?为什么首先是'1234' 而不是'0983''1239'
  • @Arvo 我总是说,当有人想要行号透视时,您想要的最大列数必须有一些限制。即使 Excel 也有限制。所以你可以转动你想要的最大值。
  • @Charlieface 就像他们说的,640K 应该对任何人都足够了;)
  • @Arvo 16384 但我想知道谁能看到这么多

标签: sql sql-server pivot unpivot


【解决方案1】:

row_number()使用条件聚合:

select crosswalk_id,
       max(case when seqnum = 1 then code end) as c1,
       max(case when seqnum = 2 then code end) as c2,
       max(case when seqnum = 3 then code end) as c3,
       max(case when seqnum = 4 then code end) as c4,
       max(case when seqnum = 5 then code end) as c5,
       max(case when seqnum = 6 then code end) as c6
from (select t.*,
             row_number() over (partition by crosswalk_id order by (select null)) as seqnum
      from t
     ) t
group by crosswalk_id;

【讨论】:

    【解决方案2】:

    您可以使用 SQL Server PIVOT 函数,它正是为此目的而设计的,即将行转换为列。

    此博客上的example of the PIVOT Function is available here

    你必须包含一个聚合子句,如果你没有重复的行,MAX() 可以很好地处理字符串值。

    有关完整文档,请查看official Microsoft doc covering PIVOT and UNPIVOT 函数。

    注意:在您的示例中,您只有一个值“ORG_201”,您可能需要更多使用该功能。您需要根据 [Code] 列中的预期值来命名列。

    【讨论】:

      【解决方案3】:

      你的 ID 不需要不同吗???

         -- DROP TABLE mytable
      
      CREATE table mytable (
          id NVARCHAR(20),
          code NVARCHAR(5)
      )
      GO
      
      INSERT INTO mytable ( id, code ) VALUES ( 'ORG_201', '1234')
      INSERT INTO mytable ( id, code ) VALUES ( 'ORG_202', '3456')
      INSERT INTO mytable ( id, code ) VALUES ( 'ORG_203', '3459')
      INSERT INTO mytable ( id, code ) VALUES ( 'ORG_204', '0983')
      INSERT INTO mytable ( id, code ) VALUES ( 'ORG_205', '2562')
      INSERT INTO mytable ( id, code ) VALUES ( 'ORG_206', '1239')
      
      SELECT      *
      FROM     mytable
      
      select * from
      (
      
          SELECT id, code
          FROM mytable
      ) t
      PIVOT (
          max(code)
          FOR id  IN ([ORG_201],[ORG_202],[ORG_203],[ORG_204],[ORG_205],[ORG_206])
      ) AS PivotTable;
      

      【讨论】:

        猜你喜欢
        • 2013-06-09
        • 1970-01-01
        • 1970-01-01
        • 2021-02-24
        • 2010-10-22
        • 2013-02-12
        • 1970-01-01
        相关资源
        最近更新 更多