#sql-server #pivot
#sql-сервер #сводная
Вопрос:
Я пытаюсь извлечь записи, которые являются номерами PO, связанными с именем файла в таблице. Одно имя файла может содержать до пяти номеров PO. Таблица выглядит следующим образом:
ID Filename PO#
-----------------------------------
1 file1 001
2 file1 002
3 file1 003
4 file1 004
5 file2 001
6 file2 002
7 file3 001
.
.
.
Чего я хочу, так это:
Filename PO#1 PO#2 PO#3 PO#4 PO#5
-----------------------------------------------------------
file1 001 002 003 004
file2 001 002
file2 001
Я попробовал сводную таблицу.
Вот мой код:
SELECT [1] AS PO1, [2] AS PO2, [3] AS PO3, [4] AS PO4,[5] AS PO5
From
(SELECT ROW_NUMBER() OVER(PARTITION BY filename ORDER BY [ID]
ASC) AS Row#, *
FROM 1) as t
PIVOT (
max(PO)
FOR Row#ByFileName IN ([1],[2], [3],[4],[5])) AS PivotTable
Однако результатом является
Filename PO#1 PO#2 PO#3 PO#4 PO#5
-----------------------------------------------------------
file1 001
file1 null 002 null null null
file1 null null 003 null null
file1 null null null 004 null
file2 001
file2 null 002 null null null
file3 001
.
.
Я также попытался использовать stuff и xml path для объединения нескольких строк в одну строку и substring для разделения одного столбца на несколько столбцов. Но я не смог получить то, что хотел.
Любые идеи были бы очень признательны.
Спасибо
Ответ №1:
Вместо этого вы можете выполнить условную агрегацию :
select filename,
max(case when seq = 1 then po end) as [PO#1],
. . .
max(case when seq = 5 then po end) as [PO#5]
from (select t.*,
row_number() over (partition by filename order by id) as seq
from table t
) t
group by filename;