Попытка сгладить строки в столбцы
У меня есть группа строк в таблице с идентификатором. Я пытаюсь сгладить его в строках с несколькими столбцами. Я почти уверен, что сделал это с помощью 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 |