我有一个使用 Oracle ROLLUP 函数的表和视图。
请参阅此处的详细信息:dbfiddle。
我想知道是否可以使用 ROLLUP 只计算某些列的总和。例如:
年份 | 客户 | 一月 | 二月 | ... | 十二月 | |
---|---|---|---|---|---|---|
2023 | 客户1 | 第1条 | 1 | 1 | ... | 1 |
2023 | 客户1 | 第2条 | 1 | 1 | ... | 1 |
2023 | 客户1 | 总和 | 2 | 2 | ... | 2 |
2023 | 客户1 | 第3条 | 1 | 1 | ... | 1 |
2023 | 客户1 | 第4条 | 1 | 1 | ... | 1 |
我希望在 Article1 和 Article2 之后有一个求和行,但不在 Article3 和 Article4 之后。
在fiddle中的示例中,我希望确定是否可以隐藏“Bücher- Warensendungen”出现行下方的“Sum”行。
由于
mbr_prodgr_id
和 mbr_prodgr
似乎具有一对一的相关性,因此您似乎不需要 ROLLUP
两者;只需 ROLLUP
主键(大概是 mbr_prodgr_id
)并通过聚合找到另一个。
然后你可以使用:
SELECT year,
gp_gr_id,
mbr_gr_id,
gp_id,
bezirk_id,
mbr_prodgr_id,
CASE
WHEN GROUPING_ID(mbr_prodgr_id) = 1
THEN 'Sum'
ELSE MAX(mbr_prodgr)
END AS mbr_prodgr,
COALESCE(SUM(CASE WHEN month = 4 THEN summe END), 0) AS apr,
COALESCE(SUM(CASE WHEN month = 5 THEN summe END), 0) AS mai,
COALESCE(SUM(CASE WHEN month = 6 THEN summe END), 0) AS juni,
sum(summe) summe_jahr
FROM t
WHERE deleted =0
AND mbr_prodgr_id IS NOT NULL
GROUP BY
year,
gp_gr_id,
mbr_gr_id,
gp_id,
bezirk_id,
ROLLUP(mbr_prodgr_id)
HAVING (GROUPING_ID(mbr_prodgr_id), MAX(mbr_prodgr_id)) NOT IN ((1, 12))
ORDER BY
year,
gp_gr_id,
mbr_gr_id,
gp_id,
bezirk_id,
mbr_prodgr_id
或者也许(取决于您是否想使用
mbr_prodgr_id
或 mbr_gr_id
进行过滤):
SELECT year,
gp_gr_id,
mbr_gr_id,
gp_id,
bezirk_id,
mbr_prodgr_id,
CASE
WHEN GROUPING_ID(mbr_prodgr_id) = 1
THEN 'Sum'
ELSE MAX(mbr_prodgr)
END AS mbr_prodgr,
COALESCE(SUM(CASE WHEN month = 4 THEN summe END), 0) AS apr,
COALESCE(SUM(CASE WHEN month = 5 THEN summe END), 0) AS mai,
COALESCE(SUM(CASE WHEN month = 6 THEN summe END), 0) AS juni,
sum(summe) summe_jahr
FROM t
WHERE deleted =0
AND mbr_prodgr_id IS NOT NULL
GROUP BY
year,
gp_gr_id,
mbr_gr_id,
gp_id,
bezirk_id,
ROLLUP(mbr_prodgr_id)
HAVING (GROUPING_ID(mbr_prodgr_id), mbr_gr_id) NOT IN ((1, 3))
ORDER BY
year,
gp_gr_id,
mbr_gr_id,
gp_id,
bezirk_id,
mbr_prodgr_id
对于样本数据(取自小提琴):
CREATE TABLE T (
GP_ID INTEGER,
MBR_GR_ID INTEGER,
BEZIRK_ID INTEGER,
GEBIET_ID INTEGER,
MBR_ID INTEGER GENERATED BY DEFAULT ON NULL AS IDENTITY ( START WITH 92541 MAXVALUE 9999999999999999999999999999 MINVALUE 1 NOCYCLE CACHE 20 NOORDER NOKEEP NOSCALE) NOT NULL,
MONTH INTEGER,
YEAR INTEGER,
SUMME INTEGER,
GP_GR_ID INTEGER,
DELETED INTEGER,
IS_SUM INTEGER,
MBR_PRODGR VARCHAR2(32 BYTE),
MBR_PRODGR_ID NUMBER
);
insert into t (
MBR_GR_ID, MBR_ID, MONTH, YEAR,
SUMME, GP_GR_ID, DELETED, MBR_PRODGR, MBR_PRODGR_ID
)
SELECT 1, 60884, 5, 2023, 3, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60885, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60886, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60887, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60888, 5, 2023, 2, 5, 0, 'Kompaktbrief', 3 FROM DUAL UNION ALL
SELECT 1, 60889, 5, 2023, 2, 5, 0, 'Maxibrief', 5 FROM DUAL UNION ALL
SELECT 1, 60890, 5, 2023, 2, 5, 0, 'Maxibrief', 5 FROM DUAL UNION ALL
SELECT 1, 60891, 5, 2023, 2, 5, 0, 'Maxibrief', 5 FROM DUAL UNION ALL
SELECT 1, 60892, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60893, 5, 2023, 1, 5, 0, 'Großbrief', 4 FROM DUAL UNION ALL
SELECT 1, 60894, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60895, 5, 2023, 2, 5, 0, 'Maxibrief', 5 FROM DUAL UNION ALL
SELECT 2, 60896, 5, 2023, 2, 5, 0, 'Info Standard', 7 FROM DUAL UNION ALL
SELECT 2, 60897, 5, 2023, 2, 5, 0, 'Info Standard', 7 FROM DUAL UNION ALL
SELECT 2, 60898, 5, 2023, 2, 5, 0, 'Info Standard', 7 FROM DUAL UNION ALL
SELECT 2, 60899, 5, 2023, 2, 5, 0, 'Info Standard', 7 FROM DUAL UNION ALL
SELECT 2, 60900, 5, 2023, 2, 5, 0, 'Info Standard', 7 FROM DUAL UNION ALL
SELECT 2, 60901, 5, 2023, 2, 5, 0, 'Info Groß', 9 FROM DUAL UNION ALL
SELECT 1, 60902, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60903, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60904, 5, 2023, 1, 5, 0, 'Großbrief', 4 FROM DUAL UNION ALL
SELECT 1, 60905, 5, 2023, 2, 5, 0, 'Maxibrief', 5 FROM DUAL UNION ALL
SELECT 1, 60906, 5, 2023, 2, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60907, 5, 2023, 1, 5, 0, 'Großbrief', 4 FROM DUAL UNION ALL
SELECT 1, 60908, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60909, 5, 2023, 2, 5, 0, 'Maxibrief', 5 FROM DUAL UNION ALL
SELECT 3, 60910, 5, 2023, 1, 5, 0, 'Bücher- Warensendungen', 12 FROM DUAL UNION ALL
SELECT 1, 60911, 5, 2023, 1, 5, 0, 'Großbrief', 4 FROM DUAL UNION ALL
SELECT 1, 60912, 5, 2023, 2, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60913, 5, 2023, 1, 5, 0, 'Großbrief', 4 FROM DUAL UNION ALL
SELECT 1, 60914, 5, 2023, 1, 5, 0, 'Großbrief', 4 FROM DUAL UNION ALL
SELECT 1, 60915, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60916, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60917, 5, 2023, 1, 5, 0, 'Großbrief', 4 FROM DUAL UNION ALL
SELECT 1, 60918, 5, 2023, 2, 5, 0, 'Kompaktbrief', 3 FROM DUAL UNION ALL
SELECT 1, 60919, 5, 2023, 2, 5, 0, 'Maxibrief', 5 FROM DUAL UNION ALL
SELECT 1, 60920, 5, 2023, 2, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60921, 5, 2023, 2, 5, 0, 'Maxibrief', 5 FROM DUAL UNION ALL
SELECT 1, 60922, 5, 2023, 2, 5, 0, 'Kompaktbrief', 3 FROM DUAL UNION ALL
SELECT 3, 60923, 5, 2023, 1, 5, 0, 'Bücher- Warensendungen', 12 FROM DUAL UNION ALL
SELECT 1, 60924, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 3, 60925, 5, 2023, 1, 5, 0, 'Bücher- Warensendungen', 12 FROM DUAL UNION ALL
SELECT 1, 60926, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60927, 5, 2023, 2, 5, 0, 'Kompaktbrief', 3 FROM DUAL UNION ALL
SELECT 1, 60928, 5, 2023, 1, 5, 0, 'Großbrief', 4 FROM DUAL UNION ALL
SELECT 1, 60929, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60930, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60931, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60932, 5, 2023, 1, 5, 0, 'Großbrief', 4 FROM DUAL UNION ALL
SELECT 1, 60933, 5, 2023, 4, 5, 0, 'Maxibrief', 5 FROM DUAL UNION ALL
SELECT 1, 60934, 5, 2023, 2, 5, 0, 'Kompaktbrief', 3 FROM DUAL UNION ALL
SELECT 1, 60935, 5, 2023, 1, 5, 0, 'Großbrief', 4 FROM DUAL UNION ALL
SELECT 3, 60936, 5, 2023, 1, 5, 0, 'Bücher- Warensendungen', 12 FROM DUAL UNION ALL
SELECT 1, 60937, 5, 2023, 1, 5, 0, 'Standardbrief', 2 FROM DUAL UNION ALL
SELECT 1, 60938, 5, 2023, 6, 5, 0, 'Maxibrief', 5 FROM DUAL UNION ALL
SELECT 1, 60939, 5, 2023, 2, 5, 0, 'Standardbrief', 2 FROM DUAL;
两个输出:
年份 | GP_GR_ID | MBR_GR_ID | GP_ID | BEZIRK_ID | MBR_PRODGR_ID | MBR_PRODGR | 四月 | 麦 | 朱尼 | SUMME_JAHR |
---|---|---|---|---|---|---|---|---|---|---|
2023 | 5 | 1 | 空 | 空 | 2 | 标准简介 | 0 | 27 | 0 | 27 |
2023 | 5 | 1 | 空 | 空 | 3 | Kompaktbrief | 0 | 10 | 0 | 10 |
2023 | 5 | 1 | 空 | 空 | 4 | 大简报 | 0 | 10 | 0 | 10 |
2023 | 5 | 1 | 空 | 空 | 5 | 最大简介 | 0 | 26 | 0 | 26 |
2023 | 5 | 1 | 空 | 空 | 空 | 总和 | 0 | 73 | 0 | 73 |
2023 | 5 | 2 | 空 | 空 | 7 | 信息标准 | 0 | 10 | 0 | 10 |
2023 | 5 | 2 | 空 | 空 | 9 | 信息大 | 0 | 2 | 0 | 2 |
2023 | 5 | 2 | 空 | 空 | 空 | 总和 | 0 | 12 | 0 | 12 |
2023 | 5 | 3 | 空 | 空 | 12 | Bücher- Warensendungen | 0 | 4 | 0 | 4 |