【问题标题】:Group by multiple columns while combining rows在组合行时按多列分组
【发布时间】:2018-10-21 19:11:24
【问题描述】:

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

什么是正确的方法?

【问题讨论】:

    标签: sql oracle group-by aggregation


    【解决方案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;
    

    现在您无需在每次引入新国家/地区时都重写查询。只需将其添加到区域表中

    【讨论】:

      【解决方案2】:

      使用Decode

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

      SQL Fiddle Demo

      【讨论】:

      • 有了这个我得到这个错误 ORA-00979: not a GROUP BY expression 。
      • @Tom 不,应该没问题,我在添加的demo上展示。
      【解决方案3】:

      您想要聚合数据,但使用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 Fiddle。

      【讨论】:

      • 有了这个我得到这个错误 ORA-00979: not a GROUP BY expression
      • @Tom 。 . .查询有效。我不知道你为什么会收到这样的错误。
      猜你喜欢
      • 2016-12-06
      • 1970-01-01
      • 2019-06-28
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      相关资源
      最近更新 更多