将多行合并为一行的 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
我有一个 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