【问题标题】:Joining select on one row for same result id在同一行加入选择以获得相同的结果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。

【问题讨论】:

  • 您确实需要一个行排序列来确保每次都获得相同的结果。

标签: sql sql-server join select pivot


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-12-31
    • 1970-01-01
    • 2019-10-29
    • 2013-08-22
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    相关资源
    最近更新 更多