微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SQL Server – PIVOT – 两列成行

我在一个专栏中看到很多关于PIVOT的问题,每个问题都比其他问题复杂,但是,我找不到任何我想要的东西.

说实话,我甚至不知道枢轴是否会在这种情况下帮助我.

假设我的源表上有这些数据:

SELECT '1' as 'RowId','RandomName1' as 'First','RandomLast1' as 'Last'
UNION
SELECT '2' as 'RowId','RandomName2' as 'First','RandomLast2' as 'Last'
UNION
SELECT '3' as 'RowId','RandomName3' as 'First','RandomLast3' as 'Last'
UNION
SELECT '4' as 'RowId','RandomName4' as 'First','RandomLast4' as 'Last'
UNION
SELECT '5' as 'RowId','RandomName5' as 'First','RandomLast5' as 'Last'

最多包含名字和姓氏的5行.
First和Last列的值将是随机的.

RowId First       Last
----- ----------- -----------
1     RandomName1 RandomLast1
2     RandomName2 RandomLast2
3     RandomName3 RandomLast3
4     RandomName4 RandomLast4
5     RandomName5 RandomLast5

我试图将这些数据转换为这样的:

First1      Last1       First2      Last2       First3      Last3       First4      Last4       First5      Last5
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
RandomName1 RandomLast1 RandomName2 RandomLast2 RandomName3 RandomLast3 RandomName4 RandomLast4 RandomName5 RandomLast5

例如:
如果列First5和Last5为NULL,我没有任何问题,因为只有4行.

First1      Last1       First2      Last2       First3      Last3       First4      Last4       First5      Last5
----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- ----------- -----------
RandomName1 RandomLast1 RandomName2 RandomLast2 RandomName3 RandomLast3 RandomName4 RandomLast4 NULL        NULL

谁能给我一点帮助?
谢谢.

基于Sheela K R的解决方案答案:

SELECT 
    MAX(First1) as 'First1',MAX(Last1) as 'Last1',MAX(First2) as 'First2',MAX(Last2) as 'Last2',MAX(First3) as 'First3',MAX(Last3) as 'Last3',MAX(First4) as 'First4',MAX(Last4) as 'Last4',MAX(First5) as 'First5',MAX(Last5) as 'Last5'
FROM
(
    SELECT 
        CASE WHEN RowId = 1 THEN [First] END as 'First1',CASE WHEN RowId = 1 THEN [Last] END as 'Last1',CASE WHEN RowId = 2 THEN [First] END as 'First2',CASE WHEN RowId = 2 THEN [Last] END as 'Last2',CASE WHEN RowId = 3 THEN [First] END as 'First3',CASE WHEN RowId = 3 THEN [Last] END as 'Last3',CASE WHEN RowId = 4 THEN [First] END as 'First4',CASE WHEN RowId = 4 THEN [Last] END as 'Last4',CASE WHEN RowId = 5 THEN [First] END as 'First5',CASE WHEN RowId = 5 THEN [Last] END as 'Last5'
    FROM
    (
        SELECT '1' as 'RowId','RandomLast1' as 'Last'
        UNION SELECT '2' as 'RowId','RandomLast2' as 'Last'
        UNION SELECT '3' as 'RowId','RandomLast3' as 'Last'
        UNION SELECT '4' as 'RowId','RandomLast4' as 'Last'
        --UNION SELECT '5' as 'RowId','RandomLast5' as 'Last'
    ) test
) test2

解决方法

您可以通过几种不同的方式获得所需的结果.与 @Sheela K R’s答案类似,您可以使用带有CASE表达式的聚合函数,但可以使用更简洁的方式编写:
select 
  max(case when rowid = 1 then first end) First1,max(case when rowid = 1 then last end) Last1,max(case when rowid = 2 then first end) First2,max(case when rowid = 2 then last end) Last2,max(case when rowid = 3 then first end) First3,max(case when rowid = 3 then last end) Last3,max(case when rowid = 4 then first end) First4,max(case when rowid = 4 then last end) Last4,max(case when rowid = 5 then first end) First5,max(case when rowid = 5 then last end) Last5
from yourtable;

SQL Fiddle with Demo.

这也可以使用PIVOT函数编写,但是由于您想要旋转多个列,因此您首先要查看对First和Last列进行unpivoting.

unpivot进程将您的多列转换为多行数据.您没有指定正在使用的sql Server版本,但您可以使用带有UNION ALL的SELECT和CROSS APPLY甚至UNPIVOT函数来执行第一次转换:

select col = col + cast(rowid as varchar(10)),value
from yourtable
cross apply 
(
  select 'First',First union all
  select 'Last',Last
) c (col,value)

请参阅SQL Fiddle with Demo.这会将您的数据转换为以下格式:

|    COL |       VALUE |
|--------|-------------|
| First1 | RandomName1 |
|  Last1 | RandomLast1 |
| First2 | RandomName2 |
|  Last2 | RandomLast2 |

一旦数据在多行中,您就可以轻松应用PIVOT功能

select First1,Last1,First2,Last2,First3,Last3,First4,Last4,First5,Last5
from
(
  select col = col + cast(rowid as varchar(10)),value
  from yourtable
  cross apply 
  (
    select 'First',First union all
    select 'Last',Last
  ) c (col,value)
) d
pivot
(
  max(value)
  for col in (First1,Last5)
) piv;

SQL Fiddle with Demo

两者都给出了以下结果:

|      FirsT1 |       LAST1 |      FirsT2 |       LAST2 |      FirsT3 |       LAST3 |      FirsT4 |       LAST4 |      FirsT5 |       LAST5 |
|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|
| RandomName1 | RandomLast1 | RandomName2 | RandomLast2 | RandomName3 | RandomLast3 | RandomName4 | RandomLast4 | RandomName5 | RandomLast5 |

原文地址:https://www.jb51.cc/mssql/79009.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐