试图将行扁平化为列
Posted
技术标签:
【中文标题】试图将行扁平化为列【英文标题】: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
【问题讨论】:
【参考方案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()。再次感谢。以上是关于试图将行扁平化为列的主要内容,如果未能解决你的问题,请参考以下文章
Python pandas:通过代理键将 JSON 扁平化为行的快速方法
IOS将UIVIew中的UIImageView扁平化为单个UIView [重复]