SQL Pivot选择多行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL Pivot选择多行相关的知识,希望对你有一定的参考价值。

这是我的表格:

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。

这是我的第一个支点,我不确定是否需要放Max(名字)?

我得到这样的表格:enter image description here

答案

使用最大选择时间如下:

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 APPLYValue来做那件事。

首先,你需要做unpivot让你的DateCreatedName在一列,这是你的预期结果。

让结果看起来像这样。

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

Results

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

CROSS APPLY ... Value

注意

如果要显示原始日期时间格式。

您可以使用CONVERTFORMAT来翻译您的预期日期时间格式。

此样本适用于FORMAT http://sqlfiddle.com/#!18/12ae9e/3

尽管formatConvert更易于使用,但是当涉及到多个数据时,它的性能很差。

以上是关于SQL Pivot选择多行的主要内容,如果未能解决你的问题,请参考以下文章

在sql中使用pivot的多行

如何在sql中使用pivot到多列

在 PIVOT SQL 之后未运行第二个选择查询

SQL - 多行到列 - 枢轴?交叉表?

SQL PIVOT 从列表中选择(在选择中)

SQL Server - Pivot 将行转换为列(带有额外的行数据)