Oracle - 按多维数据集分组 - 按不同列求和

Oracle - Group by Cube - Sum by distinct column

提问人:Mateus Schneiders 提问时间:2/13/2015 最后编辑:Mateus Schneiders 更新时间:12/22/2019 访问量:316

问:

示例数据:

product_type |segment_type  |promotion_id  |promotion_value
-----------------------------------------------------------
Beer         |Regional      |1             |20
Beer         |National      |1             |20
Beer         |Regional      |2             |20
Beer         |National      |2             |20
Beer         |National      |3             |30
Beer         |Regional      |4             |40
Soda         |Regional      |5             |50
Soda         |National      |5             |50
Soda         |Regional      |6             |50
Soda         |National      |6             |50
Soda         |National      |7             |15
Soda         |Regional      |8             |20

目的:获取按product_type和segment_type(多维数据集)分组的总促销值,考虑不同的促销活动。请注意,单次促销活动可以覆盖一个或两个细分受众群(区域和国家/地区)。

期望的结果:

product_type   |segment_type    |promotion_value
-------------------------------------------------
Beer           |                |110
Beer           |Regional        |80
Beer           |National        |70
Soda           |                |135
Soda           |Regional        |120
Soda           |National        |115

我现在的SQL如下:

SELECT product_Type,
       segment_type,
       sum(promotion_value)promotion_value
  from sample_data
 group by product_type,
          cube(segment_type)

当前结果为:

product_type   |segment_type    |promotion_value
-------------------------------------------------
Beer           |                |150
Beer           |Regional        |80
Beer           |National        |70
Soda           |                |235
Soda           |Regional        |120
Soda           |National        |115

SQLFiddle:链接

有没有办法达到预期的结果?

sql 神谕 分组依据 不同 立方体

评论

0赞 mucio 2/13/2015
有什么具体原因不应该将区域和国家相加吗?

答:

0赞 Pரதீப் 2/13/2015 #1

用于获取组中唯一值的总和Sum(Distinct..)

SELECT product_Type,
       segment_type,
       sum(distinct promotion_value)promotion_value
  from sample_data
 group by product_type,
          cube(segment_type)
          order by product_type

SQLFIDDLE 演示

更新:

SELECT product_Type,
       segment_type,
       Sum(DISTINCT promotion_value)
FROM   (SELECT product_Type,
               segment_type,
               Sum(promotion_value) promotion_value
        FROM   sample_data
        GROUP  BY product_type,
                  segment_type) a
GROUP  BY product_type,
          cube( segment_type ) 

SQLFIDDLE 演示

0赞 mucio 2/13/2015 #2

编辑:

我真的很喜欢你的想法,以前从未使用过它,我认为如果你正在处理一个适当的维度结构化表,这很酷。cube

不幸的是,这不是你的情况。Cube 将尝试生成可能的合计和小计,但理解它不应该添加您的一些数据并不那么聪明。

似乎和处于多对多的关系中,这通常不是问题,但不能由扩展自动处理。segment_typepromotion_idcube

因此,最后,为了安全起见,我认为最好的解决方案是创建两个查询来正确聚合数据:

   select product_Type, 
          segment_type,
          sum(promotion_value) promotion_value
     from sample_data
 group by product_type,
          segment_type
union all
   select product_Type, 
          null,
          sum(promotion_value) promotion_value
     from (
            select distinct product_Type,
                   promotion_id,
                   promotion_value
              from sample_data
          )
 group by product_type
 order by product_type

SQLFiddle 中的演示

0赞 praveen 12/22/2019 #3

选择“product_type”,作为segment_type,sum(promotion_value)作为promotion_value 与stack_sam相比 按product_type分组 联盟 选择 product_type,segment_type,Sum(promotion_value) 与stack_sam相比 按 product_type,segment_type 分组 按 1 排序;