SQL Pivot выбрать несколько строк - PullRequest
0 голосов
/ 30 августа 2018

У меня есть таблица:

Tasble for pivot looks like this

Я хочу создать сводку так: enter image description here

Я написал запрос, но по диагонали получаю только имена:

(
select 
[1] as Client0, 
[2] as Client1, 
[3] as Client2, 
[4] as Client3,
[5] as Client4
from 
(
select 
    rc.DateCreated, 
    gd.Name,
    DENSE_RANK() over (order by gd.ID_TableGD) as colnum
from TableGD gd
inner join TableRC rc ON gd.ID_TableGD = rc.ID_TableRC
WHERE gd.ID_TableGD IN (962,1029,1024) 
AND gd.Active = 1
) as t
pivot
(
MAX(Name)
for colnum in 
(
[1],
[2],
[3],
[4],
[5]

)
) as pvt) 

Итак, я хочу, чтобы конкретный клиент мог получить clientName (ClientA) и CreatedDate в одном столбце.

Это мой первый опорный пункт, и я не уверен, нужно ли мне ставить Макса (Имя)?

И я получаю таблицу вот так: enter image description here

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

Я бы использовал CROSS APPLY с Value, чтобы сделать это.

сначала нужно сделать unpivot, чтобы ваши DateCreated и Name были в одном столбце, что соответствует ожидаемому результату.

пусть результат будет выглядеть так.

SELECT 
  v.*
FROM T t1 CROSS APPLY(
    VALUES 
    (Name,colnum,1),
    (CAST(DateCreated AS VARCHAR(50)),colnum,2)
) v (val,colnum,grp)

Результаты

|        val | colnum | grp |
|------------|--------|-----|
|    ClientA |      1 |   1 |
| 2018-08-21 |      1 |   2 |
|    ClientB |      2 |   1 |
| 2018-08-22 |      2 |   2 |
|    ClientC |      3 |   1 |
| 2018-08-23 |      3 |   2 |

Следующим шагом вы можете попытаться использовать Pivot, чтобы вертикальные данные были горизонтальными.

CREATE TABLE T(
   Name VARCHAR(50),
   DateCreated DATE,
   colnum INT
);
INSERT INTO T VALUES('ClientA','2018-08-21',1);
INSERT INTO T VALUES('ClientB','2018-08-22',2);
INSERT INTO T VALUES('ClientC','2018-08-23',3);

Запрос 1 :

SELECT 
    MAX(CASE WHEN v.colnum = 1 THEN v.val end) client0,
    MAX(CASE WHEN v.colnum = 2 THEN v.val end) client1,
    MAX(CASE WHEN v.colnum = 3 THEN v.val end) client2,
    MAX(CASE WHEN v.colnum = 4 THEN v.val end) client3,
    MAX(CASE WHEN v.colnum = 5 THEN v.val end) client4
FROM T t1 CROSS APPLY(
    VALUES 
    (Name,colnum,1),
    (CAST(DateCreated AS VARCHAR(50)),colnum,2)
) v (val,colnum,grp)
group by grp

Результаты

|    client0 |    client1 |    client2 | client3 | client4 |
|------------|------------|------------|---------|---------|
|    ClientA |    ClientB |    ClientC |  (null) |  (null) |
| 2018-08-21 | 2018-08-22 | 2018-08-23 |  (null) |  (null) |

CROSS APPLY ... Значение

Примечание

Если вы хотите показать свой исходный формат даты и времени.

Вы можете использовать CONVERT или FORMAT для перевода ожидаемого формата даты и времени.

Этот образец для FORMAT http://sqlfiddle.com/#!18/12ae9e/3

Хотя format проще в использовании, чем Convert, при работе с несколькими данными он имеет низкую производительность.

0 голосов
/ 30 августа 2018

Используйте максимальное время выбора, как показано ниже:

select 
max([1]) as Client0, 
max([2]) as Client1, 
max([3]) as Client2, 
max([4]) as Client3,
max([5]) as Client4
from 
(
select 
    rc.DateCreated, 
    gd.Name,
    DENSE_RANK() over (order by gd.ID_TableGD) as colnum
from TableGD gd
inner join TableRC rc ON gd.ID_TableGD = rc.ID_TableRC
WHERE gd.ID_TableGD IN (962,1029,1024) 
AND gd.Active = 1
) as t
pivot
(
MAX(Name)
for colnum in 
(
[1],
[2],
[3],
[4],
[5]

)
) as pvt
...