将行转换为列的 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 |
db
【讨论】:
谢谢@Charlieface。 不客气。如果此答案解决了您的问题,请接受。最美好的祝愿以上是关于将行转换为列的 MS SQL 连接查询的主要内容,如果未能解决你的问题,请参考以下文章