对连接表SQL Server进行透视

时间:2013-06-01 18:33:14

标签: sql sql-server sql-server-2008 select

我有两个数据表

TAB1

    ---------------------------------------------
    | ID1 | ID2 | SIGNEDBY |   A    | B |   C   |
    |  1  |  8  |   'aa'   |'John'  | 9 | 12/12 |
    |  2  |  9  |   'bb'   |'Smith' | 0 | 13/12 |

TAB2

   -------------------------------------------------------------------
   | NAME | ID1 | ID2 | SIGNEDBY | VSTRING | VINT |  VDATA  |  D | E |
   | 'C1' |  1  |  8  |   'aa'   |   NULL  |   1  |   NULL  | 'l'| 5 |
   | 'C2' |  1  |  8  |   'aa'   |  'sth'  | NULL |   NULL  | 'p'| 4 |
   | 'C3' |  1  |  8  |   'aa'   |   NULL  | NULL | 12/1/13 | 'q'| 5 |
   | 'C2' |  2  |  9  |   'bb'   |  'oth'  | NULL |   NULL  | 'p'| 4 |
   | 'C3' |  2  |  9  |   'bb'   |   NULL  | NULL |  1/1/11 | 'q'| 5 |

我需要一个会产生

的查询

TAB3

    ----------------------------------------------------
    | ID1 | ID2 |   A    | B |  C1  |  C2   |    c3   | 
    |  1  |  8  | 'John' | 9 |   1  | 'sth' | 12/1/13 | 
    |  2  |  9  | 'Smith'| 0 | NULL | 'oth' |  1/1/11 |

首先,我尝试在本地创建TAB3,将数据从TAB1插入TAB3,然后为每个名为“MERGE INTO Table”的NAME插入。它工作正常但速度太慢(超过4分钟)。然后我尝试了一个类似的查询:

Select ID1, ID2, A, (Select VINT from TAB3 where Name - 'C1' and ....) 'C1',
     .... from TAB1

这也工作正常,但仍然太慢。然后我遇到了pivot命令,但我没有设法编写一个正常工作的代码。是否有可能为这个问题写一个快速查询(最好是一个)?

2 个答案:

答案 0 :(得分:0)

尝试:

select t.id1, t.id2, t.a, t.b, c1.vint c1, c2.vstring c2, c3.vdata c3
from tab1 t
left join tab2 c1 
     on t.id1=c1.id1 and t.id2=c1.id2 and t.signedby=c1.signedby and c1.name='C1'
left join tab2 c2
     on t.id1=c2.id1 and t.id2=c2.id2 and t.signedby=c2.signedby and c2.name='C2'
left join tab2 c3
     on t.id1=c3.id1 and t.id2=c3.id2 and t.signedby=c3.signedby and c3.name='C3'

答案 1 :(得分:0)

以下是使用PIVOT MAX CASE结果的替代选项,select t.id1, t.id2, t.a, t.b, max(case when t2.name = 'C1' then t2.vint end) c1, max(case when t2.name = 'C2' then t2.vstring end) c2, max(case when t2.name = 'C3' then t2.vdata end) c3 from tab1 t left join tab2 t2 on t.id1 = t2.id1 and t.id2 = t2.id2 group by t.id1, t.id2, t.a, t.b 不需要将表格重新连接到自身:

{{1}}