代码之家  ›  专栏  ›  技术社区  ›  Priyank Patel

SQL转换数据

  •  1
  • Priyank Patel  · 技术社区  · 7 年前

    我有以下格式的查询结果

    ID CODE
    ----------
     1   abc
     1   xyz
     1   def
     1   pqr
     1   jkl
     1   tuv
    

    我希望结果采用以下格式

    ID CODE1 CODE2 CODE3 CODE4 CODE5 CODE6
    ---------------------------------------
    1  abc   xyz   def   pqr   jkl   tuv
    

    我知道这可以通过使用静态 PIVOT 但我面临的问题是 CODE 列可以有未知值,我希望我的列名是固定的,即。 CODE1 ,则, CODE2 等等,直到 CODE6

    有人能帮我解决这个问题吗?

    欢迎提出任何建议。

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  5
  •   Shawn    7 年前

    这可以是使用 ROW_NUMBER() 窗口功能。我投了7分 CODE 对于 ID 1表示如果仅旋转6列,它将被忽略,但是,因为 OVER 不是确定性的(它可以 ORDER 因为它只使用 身份证件 ),它 能够 选择另一组6 密码 s

    SQL Fiddle

    MS SQL Server 2017架构设置 :

    CREATE TABLE t1 ( ID int, _CODE varchar(20) ) ;
    INSERT INTO t1 (ID, _CODE)
    VALUES 
        (1,'abc')
      , (1,'xyz')
      , (1,'def')
      , (1,'pqr')
      , (1,'jkl')
      , (1,'tuv')
      , (2,'lmn')
      , (2,'rgb')
      , (1,'ignoredOnly6')
    ;
    

    查询1 :

    SELECT piv.ID
      , piv.[1] AS CODE1
      , piv.[2] AS CODE2
      , piv.[3] AS CODE3
      , piv.[4] AS CODE4 
      , piv.[5] AS CODE5 
      , piv.[6] AS CODE6
    FROM (
      SELECT t1.ID, t1._CODE
        , ROW_NUMBER() OVER (PARTITION BY t1.ID ORDER BY t1.ID) AS rn
      FROM t1
    ) s1
    PIVOT (
      max(s1._CODE) 
      FOR s1.rn IN ([1],[2],[3],[4],[5],[6]) 
    ) piv
    

    Results :

    | ID | CODE1 | CODE2 |  CODE3 |  CODE4 |  CODE5 |  CODE6 |
    |----|-------|-------|--------|--------|--------|--------|
    |  1 |   abc |   xyz |    def |    pqr |    jkl |    tuv |
    |  2 |   lmn |   rgb | (null) | (null) | (null) | (null) |