【发布时间】:2019-07-01 02:32:46
【问题描述】:
我希望能够计算每个大陆的苹果总类型(仅限有机),按国家/地区分类;如果它们混合在一起,包括总数。
例如,食品 B1 是来自美国的有机金苹果。因此应该有一个计数“1”golden_bag 和“1”有机。现在,A1 也是来自阿根廷的有机产品 - 但是,它既有美味的奶奶苹果,也有美味的红苹果 - 因此它被计为“1”mixed_bag 和“1”用于 granny_bag 和“1”用于 red_bag。
最后,E1和F1都是老挝的富士苹果,一个是有机的,一个不是;所以总计数是 2 fuji_bag,它的总计数应该是 Organic_fd。
Table X:
food_item | food_area | food_loc | food_exp
A1 lxgs argentina 1/1/20
B1 iyan usa 5/31/21
C1 lxgs peru 4/1/20
D1 wa8e norway 10/1/19
E1 894a laos 5/1/19
F1 894a laos 9/17/19
Table Y:
food_item | organic
A1 Y
B1 Y
C1 N
D1 N
E1 Y
F1 N
Table Z:
food_item | food_type
A1 189
A1 190
B1 191
C1 189
D1 192
E1 193
F1 193
SELECT continent, country,
SUM(organic) AS organic_fd, SUM(Granny) AS granny_bag,
SUM(Red_delc) AS red_bag, SUM(Golden) AS golden_bag,
SUM(Gala) AS gala_bag, SUM(Fuji) AS fuji_bag,
SUM(CASE WHEN Granny + Red_delc + Golden + Gala + Fuji > 1 THEN 1 ELSE 0 END) AS mixed_bag
FROM (SELECT (CASE SUBSTR (x.food_area, 4, 1)
WHEN 's' THEN 'SA' WHEN 'n' THEN 'NA'
WHEN 'e' THEN 'EU' WHEN 'a' THEN 'AS' ELSE NULL END) continent,
x.food_loc country, COUNT(y.organic) AS Organic
COUNT(CASE WHEN z.food_type = '189' THEN 1 END) AS Granny,
COUNT(CASE WHEN z.food_type = '190' THEN 1 END) AS Red_delc,
COUNT(CASE WHEN z.food_type = '191' THEN 1 END) AS Golden,
COUNT(CASE WHEN z.food_type = '192' THEN 1 END) AS Gala,
COUNT(CASE WHEN z.food_type = '193' THEN 1 END) AS Fuji
FROM x LEFT JOIN z ON x.food_item = z.food_item
LEFT JOIN y on x.food_item = y.food_item and y.organic = 'Y'
WHERE x.exp_date > sysdate
GROUP BY SUBSTR (x.food_area, 4, 1), x.food_loc, y.organic) h
GROUP BY h.continent, h.country, h.organic
我没有得到正确的输出,例如,老挝将显示 TWICE 来说明有机计数和非有机计数。因此它将显示1 organic_fd 和0 organic_fd 和1 fuji_bag,另一行将是另一行1 fuji_bag。我想要总数。 (另外,如果我添加更多的食物,我的混合包会显示每条记录/行的计数大多为“1”)。
以下是所需的输出:
| continent | country |organic_fd | granny_bag| red_bag| golden_bag| gala_bag|fuji_bag | mixed_bag
| SA | argentina | 1 | 1 | 1 | 0 | 0 | 0 | 1
| SA | peru | 0 | 1 | 0 | 0 | 0 | 0 | 0
| NA | usa | 1 | 0 | 0 | 1 | 0 | 0 | 0
| EU | norway | 0 | 0 | 0 | 0 | 1 | 0 | 0
| AS | laos | 1 | 0 | 0 | 0 | 0 | 2 | 0
所以,假设我想添加另一种食品,来自挪威的 G1,它有 3 种有机苹果:fuji, red, granny... 那么挪威现在将有 1 的以下列计数:@987654329 @、organic_fd、fuji_bag、red_bag、granny_bag(除了之前的1 gala_bag计数)。如果添加与 G1 完全相同的 H1,那么它现在将具有以下总数 2:mixed_bag、organic_fd、fuji_bag、red_bag、granny_bag
【问题讨论】:
标签: sql oracle group-by aggregate-functions