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