SQL Pivot选择多行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Pivot选择多行相关的知识,希望对你有一定的参考价值。
这是我的表格:
我写了一些查询,但是我只得到对角线的名字:
(
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。
这是我的第一个支点,我不确定是否需要放Max(名字)?
答案
使用最大选择时间如下:
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
另一答案
我会用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) |
注意
如果要显示原始日期时间格式。
您可以使用CONVERT或FORMAT来翻译您的预期日期时间格式。
此样本适用于FORMAT
http://sqlfiddle.com/#!18/12ae9e/3
尽管format
比Convert
更易于使用,但是当涉及到多个数据时,它的性能很差。
以上是关于SQL Pivot选择多行的主要内容,如果未能解决你的问题,请参考以下文章