boo*_*one 19 sql common-table-expression
我在表中有一组具有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
Run Code Online (Sandbox Code Playgroud)
- 使用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
Run Code Online (Sandbox Code Playgroud)
Tar*_*ryn 28
这种数据转换称为a PIVOT.在SQL Server 2005+中,有一个函数将执行此过程.:
select *
from
(
SELECT *
FROM mytable
) src
pivot
(
max(value)
for field in (first, last)
) piv
Run Code Online (Sandbox Code Playgroud)
或者您可以将聚合函数与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
Run Code Online (Sandbox Code Playgroud)
您还可以在表上使用多个连接:
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'
Run Code Online (Sandbox Code Playgroud)
所有版本的结果都是相同的:
| ROWID | FIRST | LAST |
-------------------------
| 1 | neil | young |
| 2 | bob | dylan |
| 3 | tom | petty |
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36662 次 |
| 最近记录: |