使用listagg(distinct)和case语句的SQL查询

时间:2019-12-04 08:14:57

标签: sql oracle string-aggregation listagg

除了需要有条件地选择记录外,我需要使用listagg(distinct somestring),因此我在listagg中合并了一个case语句。

这是有效的代码示例:

listagg(case when  level_1='Brakes' and service_r_L>0.8 then  level_2 else null end  ,'+') within group (order by level_2 asc ) as Brake_services

但是我需要listagg(DISTINCT level_2 , '+'),但无法将DISTINCT放在任何地方。

抱歉,SQL代码是小写的,可能只有我一个人不愿意大写我的SQL代码。

1 个答案:

答案 0 :(得分:0)

Oracle 19c允许这样做:LISTAGG DISTINCT in Oracle Database 19c在本文中,您可以找到两种19c以前的解决方案:首先准备不同的值,或者使用row_number()。还有第三种方法,即正则表达式,用于删除输出中的重复项。这是第一个例子,可能会对您有所帮助。如果没有,请编辑您的问题,告诉我们您使用的是哪个Oracle版本,向我们显示您的完整查询和示例数据,最好像我一样使用dbfiddle

dbfiddle demo

select id_grp, listagg(case when level_1 = 'Brakes' and srl = 1
                            then level_2 end  ,'+') 
                       within group (order by level_2 asc ) as brake_services
  from (select distinct id_grp, level_1, level_2, 
               case when service_r_l > .8 then 1 else 0 end srl from t)
  group by id_grp