MS SQL 连接查询,将行转列

MS SQL join query with transposing rows to columns

我有两个 table, 测试 1

id  name    number
1   abc     12
2   xyz     12
3   pqr     12
4   mno     3
5   hij     1

测试2

id      displayorder        date
1       1               date example 1
1       2               date example 2
1       3               date example 3
2       1               date example 4
2       2               date example 5
2       4               date example 6
3       1               date example 7
3       2               date example 8
4       1               date example 9

想要这样的输出

尝试与 groupby 连接,但是当该查询是 运行 时,实际 table(不是 test1 和 test2,真正的 tables)执行时间太长,是有没有更快更快捷的方法来获得所需的输出?

架构和插入语句:

 create table test1(id int,name varchar(50),  number int);
 insert into test1 values(1   ,'abc',     12);
 insert into test1 values(2   ,'xyz',     12);
 insert into test1 values(3   ,'pqr',     12);
 insert into test1 values(4   ,'mno',     3);
 insert into test1 values(5   ,'hij',     1);

 create table test2(id int,displayorder int, date varchar(50));
 insert into test2 values(1,       1,               'date example 1');
 insert into test2 values(1,       2,               'date example 2');
 insert into test2 values(1,       3,               'date example 3');
 insert into test2 values(2,       1,               'date example 4');
 insert into test2 values(2,       2,               'date example 5');
 insert into test2 values(2,       4,               'date example 6');
 insert into test2 values(3,       1,               'date example 7');
 insert into test2 values(3,       2,               'date example 8');
 insert into test2 values(4,       1,               'date example 9');
 

查询#1(使用分组依据和聚合):

 select t.id,t.name,t.number,  max(case when displayorder=1 then date end)date1,
 max(case when displayorder=2 then date end)date2,
 max(case when displayorder=3 then date end)date3,
 max(case when displayorder=4 then date end)stage4
 from test1 t left join test2 t2 on t.id=t2.id
 group by t.id,t.name,t.number
 GO

输出:

id name number date1 date2 date3 stage4
1 abc 12 date example 1 date example 2 date example 3 <emnull</em
2 xyz 12 date example 4 date example 5 <emnull</em date example 6
3 pqr 12 date example 7 date example 8 <emnull</em <emnull</em
4 mno 3 date example 9 <emnull</em <emnull</em <emnull</em
5 hij 1 <emnull</em <emnull</em <emnull</em <emnull</em

查询#2(使用数据透视表):

 select id,name,number,[1] Date1,[2] Date2,[3] Date3,[4]Stage4
 from
 (
    select t.id,t.name,t.number, displayorder, [date]
    from test1 t left join test2 t2 on t.id=t2.id
 ) t
 pivot
 (
 max([date]) for displayorder in ([1],[2],[3],[4])
 )piv

输出:

id name number Date2 Date2 Date3 Stage4
1 abc 12 date example 1 date example 2 date example 3 <emnull</em
2 xyz 12 date example 4 date example 5 <emnull</em date example 6
3 pqr 12 date example 7 date example 8 <emnull</em <emnull</em
4 mno 3 date example 9 <emnull</em <emnull</em <emnull</em
5 hij 1 <emnull</em <emnull</em <emnull</em <emnull</em

dbhere