多列枢轴SQL Server [英] Multi Column Pivot SQL Server
问题描述
我有一个问题涉及SQL Server 2008中的多列透视.我想举一个例子来解释.
I have a problem that has deals with multi column pivoting in SQL Server 2008. I would like to explain by an example.
以下是使用内部和左侧外部联接联接6个不同表的结果
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
以下是上表的详细信息
有2种类型的ABC和XYG以及相关的日期
There are 2 types ABC and XYG and associated dates
位置和结果与ABC类型相关联
Location and Result are associates with Type ABC
有2个Proc Proc_A和Proc_B以及关联的日期
There are 2 Proc Proc_A and Proc_B and associated dates
ProcDetail和ProcNotes与Proc Proc_A相关联
ProcDetail and ProcNotes are associates with 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
感谢您的关注.
推荐答案
如果预先知道值ABC
和XYG
,则可以进行条件聚合
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
示例输出:
| 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 |
这里是 SQLFiddle 演示
Here is SQLFiddle demo
这篇关于多列枢轴SQL Server的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!