提问人:Mateus Schneiders 提问时间:2/13/2015 最后编辑:Mateus Schneiders 更新时间:12/22/2019 访问量:316
Oracle - 按多维数据集分组 - 按不同列求和
Oracle - Group by Cube - Sum by distinct column
问:
示例数据:
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:链接
有没有办法达到预期的结果?
答:
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
更新:
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 )
0赞
mucio
2/13/2015
#2
编辑:
我真的很喜欢你的想法,以前从未使用过它,我认为如果你正在处理一个适当的维度结构化表,这很酷。cube
不幸的是,这不是你的情况。Cube 将尝试生成可能的合计和小计,但理解它不应该添加您的一些数据并不那么聪明。
似乎和处于多对多的关系中,这通常不是问题,但不能由扩展自动处理。segment_type
promotion_id
cube
因此,最后,为了安全起见,我认为最好的解决方案是创建两个查询来正确聚合数据:
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
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 排序;
评论