我在具有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
此数据转换称为PIVOT。在SQL Server 2005+中,有一个函数可以执行此过程。:
PIVOT
select * from ( SELECT * FROM mytable ) src pivot ( max(value) for field in (first, last) ) piv
请参阅带有演示的SQL Fiddle。
或者,您可以将聚合函数与CASE表达式一起使用:
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
您还可以在表上使用多个联接:
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 |