在组合行时按多列分组

时间:2018-05-11 11:16:11

标签: sql oracle

我在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

这是正确的方法吗?

2 个答案:

答案 0 :(得分:1)

您希望聚合数据,但使用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;

Here是一个SQL小提琴。

答案 1 :(得分:1)

要完成答案,有一个艰难的方法。

创建一个参考表,将每个国家/地区映射到一个地区

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;

现在,每次新国家/地区推出时,您都不需要重写查询。只需将其添加到区域表