如何基于另一列调整LISTAGG聚合结果的排序?
解决LISTAGG按关联列排序聚合的问题
你的需求很明确:需要将item列按照对应的Desc列的排序规则进行聚合,而不是按item自身的顺序。
修改后的SQL语句
SELECT LISTAGG(a.item, ', ') WITHIN GROUP (ORDER BY a.Desc ASC) "item", LISTAGG(a.Desc, ', ') WITHIN GROUP (ORDER BY a.Desc ASC) "Desc" FROM tableA a;
为什么这样改?
原来的SQL中,第一个LISTAGG的排序依据是a.item ASC,所以会得到CDJ,CHQ,CSH,EPS的结果。现在我们把第一个LISTAGG的ORDER BY条件改成a.Desc ASC,这样数据库会先按照Desc列的升序顺序排列行,再将对应的item值拼接起来,正好符合你期望的CSH,CHQ,CDJ,EPS的结果。
验证结果
执行上述SQL后,你会得到:
| item | Desc |
|---|---|
| CSH,CHQ,CDJ,EPS | Cash,Cheque,Cross Department,EPS |
完全匹配你想要的输出效果。
内容的提问来源于stack exchange,提问作者Max Ng
相关产品推荐
相关产品推荐

