【问题标题】:trying to flatten rows into columns试图将行扁平化为列
【发布时间】:2013-01-17 01:45:14
【问题描述】:

我在一个表中有一组具有 id 的行。我正在尝试将其展平为具有多列的行。我几乎可以肯定我已经用 cte 和分区做到了这一点。

我已经使用 cte 删除重复数据,并且我认为我已经做了类似于我在这里想要完成的事情。我能够提出可行的解决方案(如下所列),但仍然觉得应该有一个更优雅的解决方案。

CREATE TABLE #MyTable ( RowID int , field VARCHAR(10), value  VARCHAR(10))  

INSERT INTO #MyTable ( RowID, field, value ) VALUES  ( 1, 'first', 'neil' )

INSERT INTO #MyTable ( RowID, field, value ) VALUES  ( 2, 'first', 'bob'  )

INSERT INTO #MyTable ( RowID, field, value ) VALUES  ( 3, 'first', 'tom'  )

INSERT INTO #MyTable ( RowID, field, value ) VALUES  ( 1, 'last', 'young' )

INSERT INTO #MyTable ( RowID, field, value ) VALUES  ( 2, 'last', 'dylan' )

INSERT INTO #MyTable ( RowID, field, value ) VALUES  ( 3, 'last', 'petty' )

SELECT * FROM #mytable

--尝试使用 cte/partition 完成此操作:

SELECT rowid, 
   [first] = (Select value FROM #mytable where field = 'first' and rowid = t.rowid), 
   [last] = (Select value FROM #mytable where field = 'last' and rowid = t.rowid)
FROM #mytable t
GROUP BY rowid

【问题讨论】:

    标签: sql common-table-expression


    【解决方案1】:

    这种数据转换称为PIVOT。在 SQL Server 2005+ 中有一个函数可以执行这个过程。 :

    select *
    from
    (
      SELECT * 
      FROM mytable
    ) src
    pivot
    (
      max(value)
      for field in (first, last)
    ) piv
    

    SQL Fiddle with Demo

    或者您可以使用带有CASE 表达式的聚合函数:

    select rowid,
      max(case when field = 'first' then value end) first,
      max(case when field = 'last' then value end) last
    from MyTable
    group by rowid
    

    SQL Fiddle with Demo

    您还可以在表上使用多个联接:

    select t1.rowid,
      t1.value first,
      t2.value last
    from mytable t1
    left join mytable t2
      on t1.rowid = t2.rowid
      and t2.field = 'last'
    where t1.field = 'first'
    

    SQL Fiddle with Demo

    所有版本的结果都是一样的:

    | ROWID | FIRST |  LAST |
    -------------------------
    |     1 |  neil | young |
    |     2 |   bob | dylan |
    |     3 |   tom | petty |
    

    【讨论】:

    • 非常感谢。枢轴绝对是我想要的。我也尝试过,但没有使用 max()。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 2019-04-23
    • 2021-05-24
    • 2022-09-23
    • 2016-01-14
    • 2019-06-22
    相关资源
    最近更新 更多