我有一个如下的查询
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;
答案 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;
首先只显示每个名称聚合数据的不同部门:
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;