汇总分组集

问题描述 投票:0回答:1

我有一个使用 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”行。

sql oracle grouping
1个回答
0
投票

由于

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

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.