Преобразуйте строки в столбцы, используя сводные 5 лучших - PullRequest
1 голос
/ 24 марта 2020

Мне нужна сводная таблица из таблицы SQL с 3 верхними записями, только с фильтром на основе пользователя.

ID         PrOjID     User       piD
-------    ----     ------      ------
1          Prj1       ABC         1
2          Prj2       XYZ         2
3          Prj3       ABC         3
4          Prj4       ABC         4
5          Prj5       PQR         5
6          Prj1       XYZ         1
7          Prj3       PQR         3
8          Prj8       ABC         8
9          Prj1       PQR         1
10         Prj10      ABC         10
11         Prj11      ABC         11
12         Prj12      ABC         12

Результат, который я хочу получить, если пользователь AB C

ID1  PROJID1  piD1  ID2  PROJID2  piD2  ID3  PROJID3  piD3  
1    prj1     1     3    PRJ3     3     4    prj4     4

Если ПОЛЬЗОВАТЕЛЬ ЭТО XYZ

ID1  PROJID1  piD1  ID2  PROJID2  piD2  ID3  PROJID3  piD3  
2    prj2     2     1    PRJ1     1     null  null    null

1 Ответ

1 голос
/ 24 марта 2020

Мы можем справиться с этим с помощью поворота с помощью ROW_NUMBER:

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY [User] ORDER BY piD) rn
    FROM yourTable
)

SELECT
    [User],
    MAX(CASE WHEN rn = 1 THEN ID END) AS ID1,
    MAX(CASE WHEN rn = 1 THEN PrOjID END) AS PROJID1,
    MAX(CASE WHEN rn = 1 THEN piD END) AS piD1,
    MAX(CASE WHEN rn = 2 THEN ID END) AS ID2,
    MAX(CASE WHEN rn = 2 THEN PrOjID END) AS PROJID2,
    MAX(CASE WHEN rn = 2 THEN piD END) AS piD2,
    MAX(CASE WHEN rn = 3 THEN ID END) AS ID3,
    MAX(CASE WHEN rn = 3 THEN PrOjID END) AS PROJID3,
    MAX(CASE WHEN rn = 3 THEN piD END) AS piD3
FROM cte
WHERE
    [User] = 'ABC'
GROUP BY
    [User];

screen capture of demo below

Демо

...