Как сделать сводную таблицу для нечислового столбца - PullRequest
0 голосов
/ 29 марта 2019

Я пытаюсь извлечь записи, которые представляют собой номера 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       

Я попробовал Pivot.

Вот мой код:

    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
.
.

Я также пытался использовать вещи и путь XML для объединения нескольких строк в одну строку и подстроки для разделения одного столбца на несколько столбцов. Но я не мог получить то, что хотел.

Любые идеи будут очень признательны.

Спасибо

1 Ответ

1 голос
/ 29 марта 2019

Вместо этого можно выполнить условное агрегирование:

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; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...