多列透视 SQL Server [英] Multi Column Pivot SQL Server

查看:13
本文介绍了多列透视 SQL Server的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个处理 SQL Server 2008 中的多列透视的问题.我想通过一个例子来解释一下.

以下是使用内连接和左外连接连接 6 个不同表的结果

ID 类型 日期 位置 结果 Proc ProcDate ProcDetail ProcNotes------------------------------------------------------------------------------------1 ABC 1/1/2010 OK AO Proc_A 1/1/2013 This is Detail Proc_A Notes1 XYG 1/2/2011 Proc_A 1/1/2013 这是详细的 Proc_A 注释1 ABC 1/1/2010 OK AO Proc_B 1/1/2011 这是详细的 Proc_B 注释1 XYG 1/2/2011 Proc_B 1/1/2011 这是详细的 Proc_B 注释

这是上表的详细信息

有 2 种类型 ABC 和 XYG 以及相关的日期

Location 和 Result 与类型 ABC 关联

有 2 个 Proc Proc_A 和 Proc_B 以及相关日期

ProcDetail 和 ProcNotes 与 Proc Proc_A 关联

没有一个值是预先知道的

我希望在单行中得到如下结果,而不是上面的结果集.

ID Type1 Date1 Type2 Date2 Location 结果 Proc1 ProcDate1 ProcNotes1 ProcDetail Proc2 ProcDate2 ProcNotes2----------------------------------------------------------------------------------------------------------------------------------------------------------------------------1 ABC 2010 年 1 月 1 日 XYZ 2011 年 1 月 2 日 OK AO Proc_A 2013 年 1 月 1 日 Proc_A 注释这是详细信息 Proc _B 2011 年 1 月 1 日 Proc_B 注释

感谢您的调查.

解决方案

如果值 ABCXYG 事先已知,则可以进行条件聚合

选择 ID,MAX(CASE WHEN type = 'ABC' THEN 'ABC' END) Type1,MAX(CASE WHEN type = 'ABC' THEN Date END) Date1,MAX(CASE WHEN type = 'XYG' THEN 'XYZ' END) Type2,MAX(CASE WHEN type = 'XYG' THEN Date END) Date2,MAX(位置)位置,MAX(结果)结果,MAX(CASE WHEN type = 'ABC' THEN [Proc] END) Proc1,MAX(CASE WHEN type = 'ABC' THEN ProcDate END) ProcDate1,MAX(CASE WHEN type = 'ABC' THEN ProcDetail END) ProcDetail1,MAX(CASE WHEN type = 'ABC' THEN ProcNotes END) ProcNotes1,MAX(CASE WHEN type = 'XYG' THEN [Proc] END) Proc2,MAX(CASE WHEN type = 'XYG' THEN ProcDate END) ProcDate2,MAX(CASE WHEN type = 'XYG' THEN ProcDetail END) ProcDetail2,MAX(CASE WHEN type = 'XYG' THEN ProcNotes END) ProcNotes2从(SELECT * FROM table1 - 这是用多个连接模拟您当前的查询) q按 ID 分组

样本输出:

<上一页>|身份证 |类型1 |日期1 |类型2 |日期2 |位置 |结果 |程序1 |程序1 |程序详情1 |简介1 |程序2 |程序2 |程序详情2 |PROCNOTES2 ||----|-------|--------------------------------|-------|--------------------------------|---------|--------|--------|--------------------------------|------|--------------|--------|--------------------------------|-----------------|----------------||1 |美国广播公司 |2010 年 1 月 1 日 00:00:00+0000 |XYZ |2011 年 1 月 2 日 00:00:00+0000 |好的 |AO |程序_B |2013 年 1 月 1 日 00:00:00+0000 |这是细节 |Proc_B 注释 |程序_B |2013 年 1 月 1 日 00:00:00+0000 |这是细节 |Proc_B 注释 |

这里是 SQLFiddle 演示

I have a problem that has deals with multi column pivoting in SQL Server 2008. I would like to explain by an example.

Below is the result of joining 6 different tables using inner and left outer join

ID  Type    Date    Location    Result  Proc    ProcDate    ProcDetail        ProcNotes
--------------------------------------------------------------------------------------
1   ABC    1/1/2010   OK          AO    Proc_A  1/1/2013   This is Detail   Proc_A Notes
1   XYG    1/2/2011                     Proc_A  1/1/2013   This is Detail   Proc_A Notes
1   ABC    1/1/2010   OK          AO    Proc_B  1/1/2011   This is Detail   Proc_B Notes
1   XYG    1/2/2011                     Proc_B  1/1/2011   This is Detail   Proc_B Notes

Here are the details of above table

There are 2 types ABC and XYG and associated dates

Location and Result are associates with Type ABC

There are 2 Proc Proc_A and Proc_B and associated dates

ProcDetail and ProcNotes are associates with Proc Proc_A

None of the values are preknown

Instead of above resultset, I would like to have a result in a single row as below.

ID       Type1     Date1       Type2     Date2     Location   Result    Proc1     ProcDate1    ProcNotes1        ProcDetail           Proc2       ProcDate2      ProcNotes2
 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 1        ABC     1/1/2010      XYZ     1/2/2011    OK         AO       Proc_A     1/1/2013    Proc_A Notes       This is Detail       Proc _B      1/1/2011         Proc_B Notes

Thanks for looking into it.

解决方案

If values ABC and XYG are known upfront you can do conditional aggregation

SELECT ID,
       MAX(CASE WHEN type = 'ABC' THEN 'ABC' END) Type1,
       MAX(CASE WHEN type = 'ABC' THEN Date END) Date1,
       MAX(CASE WHEN type = 'XYG' THEN 'XYZ' END) Type2,
       MAX(CASE WHEN type = 'XYG' THEN Date END) Date2,
       MAX(Location) Location,
       MAX(Result) Result,
       MAX(CASE WHEN type = 'ABC' THEN [Proc] END) Proc1,
       MAX(CASE WHEN type = 'ABC' THEN ProcDate END) ProcDate1,
       MAX(CASE WHEN type = 'ABC' THEN ProcDetail END) ProcDetail1,
       MAX(CASE WHEN type = 'ABC' THEN ProcNotes END) ProcNotes1,
       MAX(CASE WHEN type = 'XYG' THEN [Proc] END) Proc2,
       MAX(CASE WHEN type = 'XYG' THEN ProcDate END) ProcDate2,
       MAX(CASE WHEN type = 'XYG' THEN ProcDetail END) ProcDetail2,
       MAX(CASE WHEN type = 'XYG' THEN ProcNotes END) ProcNotes2
  FROM
(
  SELECT * FROM table1 -- that's to emulate your current query with multiple joins
) q
 GROUP BY ID

Sample output:

| ID | TYPE1 |                          DATE1 | TYPE2 |                          DATE2 | LOCATION | RESULT |  PROC1 |                      PROCDATE1 |     PROCDETAIL1 |   PROCNOTES1 |  PROC2 |                      PROCDATE2 |     PROCDETAIL2 |   PROCNOTES2 |
|----|-------|--------------------------------|-------|--------------------------------|----------|--------|--------|--------------------------------|-----------------|--------------|--------|--------------------------------|-----------------|--------------|
|  1 |   ABC | January, 01 2010 00:00:00+0000 |   XYZ | January, 02 2011 00:00:00+0000 |       OK |     AO | Proc_B | January, 01 2013 00:00:00+0000 | This is Details | Proc_B Notes | Proc_B | January, 01 2013 00:00:00+0000 | This is Details | Proc_B Notes |

Here is SQLFiddle demo

这篇关于多列透视 SQL Server的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆