【问题标题】:i want to group by using particular column but same time i need to concatenate我想通过使用特定列进行分组,但同时我需要连接
【发布时间】:2018-02-09 21:07:53
【问题描述】:

以下是一个例子:

Table A

project Name amount  detail    department    supervisor
 1234  angel  200     water      utility      you
 234     B     200     house      retail       me
 235     C     400      air      environment   where
 1234  angel  200     water     department     son
 234     B     200     house      retail       me
 235     C     400     treat      environment   where
 1234  angel  200     water      utility      you
 234     B     200     house      retail       me
 235     C     400      air      environment   where

SQL 的输出应该是 -

project   Name   amount   detail    department     supervisor
1234     angel    200      water       utility      you,son
234        B      200       house       retail       me
235        C      400      air,treat   environment    where

删除重复类型也不同..

好吧,我尝试使用 LISTAgg,但问题是我需要按项目对其进行分组,并且不想将其分组为我的详细信息和详细信息列,但我需要一个不同的值来详细传递,主管列希望有人可以帮助

【问题讨论】:

  • 我认为行 1234 angel 200 water department son1234 angel 200 water utility son,不是吗?

标签: sql oracle listagg


【解决方案1】:

您可以加入三个嵌套子查询并使用distinctunique 摆脱duplicates

select distinct * from
(
 select dt.project, dt.Name, dt.amount, details, departments, supervisors 
   from
 (select project, Name, amount, listagg(detail, ',') within group (order by detail) details
   from ( select unique project, Name, amount, detail from a )
  group by project, Name, amount) dt
inner join
 (select project, Name, amount, listagg(department, ',') within group (order by department) departments
    from ( select unique project, Name, amount, department from a )
   group by project, Name, amount) dp on (dt.project=dp.project)
inner join
  (select project, Name, amount, listagg(supervisor, ',') within group (order by supervisor desc) supervisors
     from ( select unique project, Name, amount, supervisor from a )
    group by project, Name, amount) sp on (dt.project=sp.project)
)
order by lower(name);

Demo

【讨论】:

  • 我们不能在一个子查询中写下所有的listagg
  • @palkodi 很抱歉,但尝试这个非常困难,如果没有重复,用一个子查询完成会非常困难。
  • 除了 listagg 之外还有其他方法可以在连接时使用不同的值。
  • @palkodi 抱歉,我不知道。假设可以使用 pl/sql 而不是 sql 来完成更多尝试。
【解决方案2】:

这是一个痛苦的问题,因为您需要消除重复项。 listagg() 不支持distinct

因此,每个子查询都需要多个子查询:

select a.project, a.name, a.amount, a.department, ad.details, asu.supervisors
from a join
     (select project, listagg(detail, ',') within group (order by project) as details
      from (select distinct project, name, amount, department, detail
            from a
           ) a
      group by project
     ) ad
     on ad.project = a.project join
     (select project, listagg(supervisor, ',') within group (order by project) as supervisors
      from (select distinct project, name, amount, department, supervisor
            from a
           ) a
      group by project
     ) asu
     on asu.project = a.project   
group by project, name, amount, department;

【讨论】:

  • 对不起,结果是ORA-00904: "AD"."PROJECT": invalid identifier (sqlfiddle.com/#!4/0b669/2)
  • @Gordon 很好,如果你在做 listagg 时你也做不同的事情,你仍然得到相同的结果。它在蟾蜍中对我不起作用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
相关资源
最近更新 更多