当前位置: 首页 > 面试题库 >

SQL Server-PIVOT-两列成行

锺功
2023-03-14
问题内容

我在一个专栏中看到了很多关于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行,包含名字和姓氏。第一和最后一列的值将是随机的。

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 KR的解决方案可以回答:

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', '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'
    ) test
) test2

问题答案:

您可以通过几种不同的方法来获得所需的结果。类似于@Sheela K
R的
答案,您可以将聚合函数与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。

这也可以使用PIVOThtml" target="_blank">函数编写,但是,由于要旋转多个列,则首先要查看不旋转FirstLast列。

取消透视处理会将您的多列转换为多行数据。您没有指定要使用的SQL Server版本,但可以将SELECTwithUNION ALL与withCROSS 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。这会将您的数据转换为以下格式:

|    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, Last1, First2, Last2,
              First3, Last3, First4, Last4, First5, Last5)
) piv;

参见带有演示的SQL Fiddle

两者都给出以下结果:

|      FIRST1 |       LAST1 |      FIRST2 |       LAST2 |      FIRST3 |       LAST3 |      FIRST4 |       LAST4 |      FIRST5 |       LAST5 |
|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|-------------|
| RandomName1 | RandomLast1 | RandomName2 | RandomLast2 | RandomName3 | RandomLast3 | RandomName4 | RandomLast4 | RandomName5 | RandomLast5 |


 类似资料:
  • 问题内容: 我如何使用SQL PIVOT命令对看起来像这样的数据进行sql透视? 变成这样的东西: 问题答案: 尝试这样的事情: 这将产生以下结果:

  • 试图找到一个解决方案,但到目前为止没有任何有用的东西。我试图从以下格式透视SQL表: 到这个

  • 问题内容: 我正在尝试“ PIVOT”,但尚未达到预期的结果。 问题答案: 这应该工作:

  • Pivot 是一个开源PHP文本型Blog程序,有以下优点 1. 不需要MySQL数据库 2. 代码写得比较好,Blog应有的功能都有 3. 生成HTML(其实是缓存解析) 4. 速度很快 5. 支持Rewrite,和WordPress差不多 6. 有中文包 7. 程序结构很不错 来个Pivot后台图片

  • Apache Pivot 是一个开放源代码平台,用于构建可安装的Internet应用程序(IIA)。它结合了现代用户界面工具包的增强的生产力和可用性功能以及Java平台的强大功能。 通过Pivot,开发人员可以轻松地用Java或任何其他JVM语言(例如JavaScript,Groovy或Scala)构建具有视觉吸引力的,跨平台的,相互连接的应用程序。Pivot也是唯一真正开放的IIA框架:它是完全

  • 本文向大家介绍深入SQL中PIVOT 行列转换详解,包括了深入SQL中PIVOT 行列转换详解的使用技巧和注意事项,需要的朋友参考一下 PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT与PIVOT执行相反的操作,将表值表达式的列转换为列值。 通俗简单的说:PIVOT就是行转列,UNPIVOT就是列传行 一、