尝试将行转换为列

25

我有一个表格中的一组带有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/分区来完成此操作:

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
1个回答

39

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

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

请查看带演示的SQL Fiddle

或者您可以使用带有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

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

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

所有版本的结果都相同:

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

2
非常感谢。枢轴绝对是我在寻找的。我也尝试过,但没有使用max()。再次感谢。 - boone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接