按内部分组

时间:2018-04-02 17:47:04

标签: sql oracle rdbms

是否可以通过组内部执行组? 实际上我有一个现有的SQL请求,它返回一些数据,这些数据按子id分组。我想纠正它并按原样显示数据,除了符合条件的某些信息,我想通过父ID显示它们。 请注意,父ID可能包含多个子ID。 你能帮忙吗? 我们考虑下表:

parentID childID value YN AB 
1       | 11     |3   |Y  |A 
1       | 12     |2   |Y  |A 
2       | 13     |8   |Y  |B  
3       | 14     |9   |Y  |A 

实际代码返回Y按cildID分组的值。我想要的是总是返回值列,但有一个额外的条件:如果AB = A然后返回由parentID分组的值的总和,如果不按原样返回(按childid分组)

1 个答案:

答案 0 :(得分:1)

您可以在ChildID列上使用CASE表达式,在AB ='B'时返回childID,否则返回NULL,然后按ParentID和CASE表达式分组:

with YourData(parentID, childID, value, YN, AB) as (
  select 1, 11, 3, 'Y', 'A' from dual union all 
  select 1, 12, 2, 'Y', 'A' from dual union all 
  select 2, 13, 8, 'Y', 'B' from dual union all  
  select 3, 14, 9, 'Y', 'A' from dual 
)
select parentID
     , case ab when 'B' then childID end childID
     , sum(value) value
  from YourData
 group by parentID
     , case ab when 'B' then childID end
 order by parentID, childID;

 PARENTID    CHILDID      VALUE
---------- ---------- ----------
         1                     5
         2         13          8
         3                     9

您还可以使用GROUP BY ROLLUP来使用适当的HAVING子句获得相同的结果:

select parentID
     , childID
     , sum(value) value
  from YourData
 group by rollup ((parentID, AB), childID)
having (grouping(childID) = 1 and AB = 'A')
    or (grouping(childID) = 0 and AB = 'B')
 order by parentID, childID;

 PARENTID    CHILDID      VALUE
---------- ---------- ----------
         1                     5
         2         13          8
         3                     9