将多行合并为一行的 CUBE 语句 - SQL 11g

CUBE Statement to merge rows into one row - SQL 11g

我有一个 Table 这样的:

dwh_data:

 DATETIME        FK_FEDERAL_STATE     FK_ACCOMODATION      ARRIVALS     NIGHTS
--------------- -------------------- ------------------- ---------- ----------
    200010               W96-3           60                8012      24724
    200010               W96-3           61                2283       7715
    200010               W96-3           86                 674       4171
    200010               W96-3           87                 329       1998

提示:日期时间 = 前 4 个数字 = 年 + 后两个数字 = 月

这是我的声明:

SELECT SUBSTR(datetime,1,4), dwh_accomodations.name, SUM(NIGHTS)
FROM dwh_data
     JOIN DWH_ACCOMODATIONS
        ON dwh_data.fk_accomodation = DWH_ACCOMODATIONS.CODE
  GROUP BY CUBE(datetime, dwh_accomodations.name)
  ORDER BY datetime;

我的陈述给出了这个结果:

 SUBS NAME                                               SUM(NIGHTS)
---- -------------------------------------------------- -----------
1998 ACC_TYPE1                                               104506
1998 ACC_TYPE2                                               150524
1998 ACC_TYPE1                                               399419

问题是一年有重名。 SUBS = 年份

我想将具有相同值的所有名称放在一行中。结果应该是这样的:

 SUBS NAME                                               SUM(NIGHTS)
---- -------------------------------------------------- -----------
1998 ACC_TYPE1                                               504925
1998 ACC_TYPE2                                               150524

还要按年份分组吗?

SELECT 
  SUBSTR(datetime,1,4) AS year
, acco.name
, SUM(NIGHTS) AS Total
FROM dwh_data AS data
JOIN DWH_ACCOMODATIONS AS acco
  ON acco.CODE = data.fk_accomodation
GROUP BY CUBE(SUBSTR(datetime,1,4), acco.name)
ORDER BY year;

简单测试

create table test(
 yearmonth char(6), 
 grp char(1), 
 col number
)
insert all
into test (yearmonth, grp, col) values ('202110', 'A', 10)
into test (yearmonth, grp, col) values ('202111', 'A', 20)
into test (yearmonth, grp, col) values ('202012', 'B', 40)
select 1 from dual;
select SUBSTR(yearmonth,1,4) as year, grp, sum(col) as tot
from test
group by SUBSTR(yearmonth,1,4), grp
order by year
YEAR | GRP | TOT
:--- | :-- | --:
2020 | B   |  40
2021 | A   |  30
select SUBSTR(yearmonth,1,4) as year, grp, sum(col) as tot
from test
group by rollup(SUBSTR(yearmonth,1,4), grp)
order by year
YEAR | GRP  | TOT
:--- | :--- | --:
2020 | B    |  40
2020 | null |  40
2021 | A    |  30
2021 | null |  30
null | null |  70
select SUBSTR(yearmonth,1,4) as year, grp, sum(col) as tot
from test
group by cube(SUBSTR(yearmonth,1,4), grp)
order by year
YEAR | GRP  | TOT
:--- | :--- | --:
2020 | B    |  40
2020 | null |  40
2021 | A    |  30
2021 | null |  30
null | A    |  30
null | B    |  40
null | null |  70

db<>fiddle here