0

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

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

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

以下是上表的详细信息

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

位置和结果与 ABC 类型相关联

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

ProcDetail 和 ProcNotes 与 Proc Proc_A 关联

没有任何值是预先知道的

而不是上面的结果集,我想在一行中得到一个结果,如下所示。

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

感谢您调查它。

4

1 回答 1

1

如果值ABCXYG预先知道,您可以进行条件聚合

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

样本输出:

| 身份证 | 类型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演示

于 2013-11-06T01:41:56.557 回答