Группировка по нескольким столбцам при объединении строк - PullRequest
0 голосов
/ 11 мая 2018

У меня есть такая таблица в ORACLE.

COUNTRY | AMOUNT  | MONTH
USA     | 100     | 1
USA     | 100     | 1
USA     | 100     | 2
FRA     | 100     | 1
ITA     | 100     | 1
ITA     | 100     | 2
FRA     | 100     | 2

И мне нужно в результате получить такую ​​таблицу.Группировка строк по месяцам и объединение определенных стран (в данном примере, если страна FRA или ITA, она будет изменена на EUR).

COUNTRY | AMOUNT  | MONTH
USA     | 200     | 1
EUR     | 200     | 1
USA     | 100     | 2
EUR     | 200     | 2

Каков будет правильный подход для этого?

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Использование Decode:

SELECT DECODE(COUNTRY,'USA',COUNTRY,'EUR') COUNTRY, SUM(AMOUNT) AMOUNT, MONTH
  FROM TAB
 GROUP BY DECODE(COUNTRY,'USA',COUNTRY,'EUR'), MONTH ;

Демонстрация SQL Fiddle

0 голосов
/ 11 мая 2018

Чтобы завершить набор ответов, есть трудный путь.

Создайте справочную таблицу для сопоставления каждой страны с регионом

COUNTRY | REGION
USA     | USA
FRA     | EUR
ITA     | EUR

А теперь используйте этот запрос для получения результатов

select r.region, sum(amount), month
from country c inner join region r
  on c.country = r.country
group by r.region, c.month
order by r.region, c.month;

Теперь вам не нужно переписывать запрос каждый раз, когда вводится новая страна.Просто добавьте его в таблицу регионов

0 голосов
/ 11 мая 2018

Вы хотите объединить данные, но с использованием выражения case:

select (case when country in ('ITA', 'FRA') then 'EUR' else country end) as country,
       sum(amount), month
from t
group by (case when country in ('ITA', 'FRA') then 'EUR' else country end), month;

Здесь - это SQL-скрипта.

...