将行转换为列的 MS SQL 连接查询

Posted

技术标签:

【中文标题】将行转换为列的 MS SQL 连接查询【英文标题】:MS SQL join query with transposing rows to columns 【发布时间】:2021-04-08 12:12:09 【问题描述】:

我有两张桌子, 测试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 进行连接,但是当在实际表(不是 test1 和 test2,真正的表)上运行该查询时执行时间过长,是否有任何快速快速的方法来获得所需的输出?

【问题讨论】:

不要使用图像作为数据,使用格式化测试。请向我们展示您的尝试。 编辑您的问题并显示您正在运行的查询。还提供有关表的大小信息并列出表上定义的任何索引。执行计划也很有帮助。 会一直有四个显示顺序吗?还是动态的? 总会有4个 编辑添加格式化数据而不是图像 【参考方案1】:

架构和插入语句:

 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

【讨论】:

谢谢@Charlieface。 不客气。如果此答案解决了您的问题,请接受。最美好的祝愿

以上是关于将行转换为列的 MS SQL 连接查询的主要内容,如果未能解决你的问题,请参考以下文章

MS Access SQL 将行转换为列

不能从子查询将行转换为列

将特定行转换为列的 SQL 查询

在 SQL Server 视图中有效地将行转换为列

Mysql查询根据两列动态将行转换为列

在 SQL 中使用“Pivot”将行转换为列