【发布时间】:2020-09-08 18:14:19
【问题描述】:
这是我的 SQL:
WITH source1 AS (
SELECT 'Fruit' foodtype, 'Apple' food, 20 weight FROM dual UNION
SELECT 'Fruit' foodtype, 'Apple' food, 30 weight FROM dual UNION
SELECT 'Fruit' foodtype, 'Grape' food, 1 weight FROM dual UNION
SELECT 'Veg' foodtype, 'Carrot' food, 40 weight FROM dual UNION
SELECT 'Veg' foodtype, 'Leek' food, 20 weight FROM dual
)
SELECT grouping(food) lv, foodtype, food, max(weight) weight
FROM source1
GROUP BY foodtype, ROLLUP (food);
输出如下:
LV FOODTYPE FOOD WEIGHT
-- -------- ------ ------
0 Veg Leek 20
0 Veg Carrot 40
1 Veg 40
0 Fruit Apple 30
0 Fruit Grape 1
1 Fruit 30
我期待它看起来像这样:
LV FOODTYPE FOOD WEIGHT
-- -------- ------ ------
0 Veg Leek 20
0 Veg Carrot 40
1 Veg 60
0 Fruit Apple 30
0 Fruit Grape 1
1 Fruit 31
换句话说,我希望 rollup 总结每种食物的最大重量,而不是取食物类型类别中所有最大值中的最大值。
我确实有各种各样的解决方案,但这意味着必须添加一层额外的 SQL 语句嵌套:
WITH source1 AS (
SELECT 'Fruit' foodtype, 'Apple' food, 20 weight FROM dual UNION
SELECT 'Fruit' foodtype, 'Apple' food, 30 weight FROM dual UNION
SELECT 'Fruit' foodtype, 'Grape' food, 1 weight FROM dual UNION
SELECT 'Veg' foodtype, 'Carrot' food, 40 weight FROM dual UNION
SELECT 'Veg' foodtype, 'Leek' food, 20 weight FROM dual
), source_grp AS (
SELECT s.foodtype, s.food, max(s.weight) max_weight
FROM source1 s
GROUP BY foodtype, food
)
SELECT grouping(g.food) lv, g.foodtype, g.food, sum(g.max_weight) weight
FROM source_grp g
GROUP BY g.foodtype, ROLLUP (g.food);
有没有办法在没有额外嵌套的情况下做到这一点?
当然,从我的实际情况来看,这个例子已经大大简化了,这就是为什么我试图找到一种方法来减少代码行数。从长远来看,将一条 SQL 语句减少 60 行代码可显着简化其维护。
【问题讨论】: