在同一行加入选择以获得相同的结果ID
Posted
技术标签:
【中文标题】在同一行加入选择以获得相同的结果ID【英文标题】:Joining select on one row for same result id 【发布时间】:2019-04-28 20:43:25 【问题描述】:我有以下查询结果(我将此结果存储在#TMP 表中)
Id | Letter | Column1 | Column2
1 | A | 400 | 200
1 | A | 101 | 201
1 | A | 102 | 203
2 | A | 100 | 200
2 | A | 700 | 201
2 | A | 102 | 202
我想要做的是对该#TMP 表进行选择,但现在我想要这样的输出:
Id | Letter | Alias1 | Alias2 | Alias1-1 | Alias2-1 | Alias1-2 | Alias2-2
1 | A | 400 | 200 | 101 | 201 | 102 | 203
2 | A | 100 | 200 | 700 | 201 | 102 | 202
我怎样才能做到这一点?我尝试加入,但我得到了很多相同的结果。
select A.Id, A.Letter, B.Column1, B.Column2
from #TMP A
inner join #TMP B ON A.Id = B.Id AND A.Letter = B.Letter
我也尝试过分组
select Id, Letter, Column1, Column2
from #TMP
group by Id
但是此查询要求按语法将字母、column1、column2 添加到组中,如果我这样做,我会得到与 select * from #TMP 相同的结果
PD:#TMP 表必须始终包含 3 个相同的 id,letter 行
PD2:对于具有相同 Id 的结果,Column1 的值可能在一行中大于 Column2 的值,而在下一行中,column2 的值可能大于 column1。
【问题讨论】:
您确实需要一个行排序列来确保每次都获得相同的结果。 【参考方案1】:row_number()
窗口函数可以和conditional aggregation
一起使用
with t(Id,Letter,Column1,Column2) as
(
select 1,'A',100,200 union all
select 1,'A',101,201 union all
select 1,'A',102,203 union all
select 2,'A',100,200 union all
select 2,'A',101,201 union all
select 2,'A',102,202
), t2 as
(
select
*,
row_number() over (partition by Id,Letter order by Column1) as rn
from [t]
)
select Id,Letter,
max(case when rn = 1 then Column1 end ) as [Alias1],
max(case when rn = 2 then Column1 end ) as [Alias2],
max(case when rn = 3 then Column1 end ) as [Alias1-1],
max(case when rn = 1 then Column2 end ) as [Alias2-0],
max(case when rn = 2 then Column2 end ) as [Alias2-1],
max(case when rn = 3 then Column2 end ) as [Alias2-2]
from t2
group by Id,Letter
Demo
【讨论】:
以上是关于在同一行加入选择以获得相同的结果ID的主要内容,如果未能解决你的问题,请参考以下文章
当用户在 GridView ASP.NET 中选择一行时如何自动选择相同 ID 的其他行