【问题标题】:Transpose 2 SQL rows to Columns without single record rows将 2 个 SQL 行转置为没有单个记录行的列
【发布时间】:2016-09-22 03:04:57
【问题描述】:

我正在尝试设计一个查询以在 SQL 中转置下表:

|Name| |Type|
  A       X
  B       X
  C       Y
  D       Y
  E       Z

输出:

|X|  |Y|  |Z|
 A    C    E
 B    D  <Blank>

但我最终得到的只是使用 pivot 或 max case 语句:

  |X|  |Y|  |Z|
   A   Null Null
   B   Null Null
  Null  C   Null
  Null  D   Null
  Null Null  E

这可能吗?提前致谢;

【问题讨论】:

    标签: sql-server tsql pivot case transpose


    【解决方案1】:

    试试这个:

    SELECT MAX(CASE WHEN Type = 'X' THEN Name END),
           MAX(CASE WHEN Type = 'Y' THEN Name END),
           MAX(CASE WHEN Type = 'Z' THEN Name END)
    FROM (
      SELECT Name, Type, 
             ROW_NUMBER() OVER (PARTITION BY Type ORDER BY (SELECT NULL)) AS rn
    FROM mytable) AS t
    GROUP BY rn
    

    【讨论】:

    • 谢谢,这正是我想要的。解决方案效果很好。
    • @SQALEX101 很高兴我能提供帮助并欢迎来到 Stack Overflow。如果它帮助您解决问题,请将此或任何其他答案标记为已接受。
    【解决方案2】:

    如果出于某种原因,您有重复的 [Name]、[Type] 记录并且只想查看一个,则应使用 DENSE_RANK 而不是 ROW_NUMBER。这也是 PIVOT 版本。

    SELECT  [X], [Y], [Z] 
    FROM    (
        SELECT  [Name], [Type], 
                DENSE_RANK() OVER( PARTITION BY [Type] ORDER BY [Name]) Rn
        FROM    Table1) t 
    PIVOT (
        MAX([Name])
        FOR [Type] IN ([X], [Y], [Z])) p
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-11
      • 1970-01-01
      • 2016-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      相关资源
      最近更新 更多