Объединить две строки как новую строку и суммировать по значению

#oracle #oracle11g

#Oracle #oracle11g

Вопрос:

Используя приведенный ниже запрос, я получаю результаты в формате ниже.

 select count(o.orderid) as ORDER,u.usergroup as user 
from order_details o,user_deatils u
where o.ORDERCREATOR=u.USERNAME
and u.usergroup IN ('A','B','C','D')
group by u.usergroup;
  

ЗАКАЗАТЬ ПОЛЬЗОВАТЕЛЯ
10 A
20 B
30 C
40 D

но я пытаюсь объединить C и D, имеющие разные значения, и соответственно суммировать их значения

 ORDER   USER
10       A
20       B
70      C D
  

я пробовал с помощью pivot, concat, но не смог получить результат в желаемом формате.

любое преимущество было бы заметным 🙂

Ответ №1:

Вы можете агрегировать, используя CASE выражение:

 select
    case when u.usergroup = 'A' then 'A'
         when u.usergroup = 'B' then 'B'
         else 'C D' end as user,
    count(o.orderid) as "ORDER"
from order_details o
inner join user_deatils u
    on o.ORDERCREATOR = u.USERNAME
where
    u.usergroup IN ('A','B','C','D')
group by
    case when u.usergroup = 'A' then 'A'
         when u.usergroup = 'B' then 'B'
         else 'C D' end;
  

Ответ №2:

Используйте функцию декодирования:

 select count(o.orderid) as ORDER,decode(u.usergroup,'C','C D','D','C D',u.usergroup) as user 
from order_details o,user_deatils u
where o.ORDERCREATOR=u.USERNAME
and u.usergroup IN ('A','B','C','D')
group by decode(u.usergroup,'C','C D','D','C D',u.usergroup);
  

Комментарии:

1. большое спасибо, это сработало. еще один небольшой запрос, если я хочу добавить псевдоним, например, A как Север, B как Юг, должен ли я упомянуть об этом в разделе decode.

2. @S.Das да, как в select, так и в group by decode(u.usergroup,'A','North','B','South',...

Ответ №3:

С РЕГИСТРОМ и правильным соединением:

 select 
  count(o.orderid) as ORDER,
  case 
    when u.usergroup in ('C', 'D') then 'C D'
    else u.usergroup
  end usergroup
from order_details o inner join user_deatils u
on o.ORDERCREATOR = u.USERNAME
and u.usergroup IN ('A','B','C','D')
group by usergroup;