group by返回额外的行

时间:2015-07-23 08:52:28

标签: sql oracle group-by

我有一个如下的查询

select name,
          sum(...) col1, 
          sum(...) col2,
          sum(...) col3
From 
          table1
group by name;

此查询返回3行

现在假设我想在上面的查询中再说一个栏目,我将其修改如下。现在的问题是,它返回4行(一个额外的行),我不想要。

现在能够得到这背后的逻辑,是否有可能获得与我没有逐个部门并且仍然获得其值的相同结果。请帮忙。

select name, department
          sum(...) col1, 
          sum(...) col2,
          sum(...) col3
From 
          table1
group by name, department;

3 个答案:

答案 0 :(得分:2)

您可以使用list_agg()连接部门:

select name, sum(x1) col1, sum(x2) col2, sum(x3) col3,
       listagg(department,', ') within group (order by department) departments
  from table1 group by name order by name;

SQLFiddle

首先只显示每个名称聚合​​数据的不同部门:

select name, sum(col1) col1, sum(col2) col2, sum(col3) col3,
       listagg(department,', ') within group (order by department) departments
  from (
    select name, department, sum(x1) col1, sum(x2) col2, sum(x3) col3
      from table1 group by name, department)
  group by name order by name;

答案 1 :(得分:1)

问题是,对于给定的名称,有一个以上的部门。没有办法聚合结果来解决这个问题 - 最好,你需要在结果集行的列中有多个department值。这总是很棘手。在MS SQL上,您可以执行(select department from table1 t where t.name = table1.name for xml raw)之类的操作,但我不确定在Oracle中是否可以使用这样的东西。也许是自定义聚合函数?

如果你没有严格关心这一点,那么做max(department)之类的事情而不是按照它进行分组可能会有效。但要明白你得到的结果 - 这可能是完全错误的。

答案 2 :(得分:1)

使用以下查询:

select name,
       listagg(department, ', ') within group (order by name),
       sum(...) col1, 
       sum(...) col2,
       sum(...) col3
  from table1
  group by name;