Как создать сводную таблицу для нечислового столбца

#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;