【发布时间】:2018-05-30 08:40:17
【问题描述】:
我需要根据 VARCHAR 列值和年份范围对 MySQL 表的列值求和。也许这很令人困惑,所以我将举一个基本的例子:
列:id(对此无用)、fruit_type、date_of_sale、sale_type、price
基本查询:
SELECT * FROM fruits
给我:
1 APPLES 2018-05-30 GOOD 50.50
2 APPLES 2018-05-30 BAD -20.50
3 APPLES 2018-05-30 GOOD 40.00
4 APPLES 2018-05-30 BAD -10.50
5 APPLES 2017-05-29 GOOD 39.50
6 APPLES 2017-05-29 BAD -10.00
7 APPLES 2017-05-29 GOOD 30.00
8 APPLES 2017-05-29 BAD -20.00
9 BANANAS 2018-05-29 GOOD 20.00
10 BANANAS 2018-05-29 BAD 20.00
11 BANANAS 2018-05-29 GOOD 10.00
12 BANANAS 2018-05-29 BAD -5.00
13 BANANAS 2017-05-29 GOOD 50.00
14 BANANAS 2017-05-29 BAD -3.00
15 BANANAS 2017-05-29 GOOD 10.00
16 BANANAS 2017-05-29 BAD -3.00
17 ORANGES 2018-05-28 GOOD 5.00
18 ORANGES 2018-05-28 BAD -1.00
19 ORANGES 2017-05-28 GOOD 10.00
20 ORANGES 2017-05-28 BAD -1.00
我需要完成什么:
Fruit Sales 2017 Bad Sales 2017 Total 2017 Sales 2018 Bad Sales 2018 Total 2018
APPLES 69.50 -30.00 39.50 90.50 -30.50 60.00
BANANAS 60.00 -6.00 54.00 30.00 -10.00 20.00
ORANGES 10.00 -1.00 9.00 5.00 -1.00 5.00
我一直在尝试的查询是:
SELECT fruit_type AS Fruit,\
(SELECT SUM(price) FROM fruits WHERE sale_type='GOOD' AND date_of_sale BETWEEN '2017-01-01' AND '2017-12-31') AS Sales_2017,\
(SELECT SUM(price) FROM fruits WHERE sale_type='BAD' AND date_of_sale BETWEEN '2017-01-01' AND '2017-12-31') AS Bad_Sales_2017,\
(SELECT SUM(Sales_2017-Bad_Sales_2017)),\
(SELECT SUM(price) FROM fruits WHERE sale_type='GOOD' AND date_of_sale BETWEEN '2018-01-01' AND '2018-12-31') AS Sales_2018,\
(SELECT SUM(price) FROM fruits WHERE sale_type='BAD' AND date_of_sale BETWEEN '2018-01-01' AND '2018-12-31') AS Bad_Sales_2018,\
(SELECT SUM(Sales_2018-Bad_Sales_2018)),\
FROM fruits
GROUP BY fruit_type;
问题是查询返回的值是整列的总和,其值为 GOOD 或 BAD,而不是按水果类型匹配的值 GOOD。
需要一些技巧来解决这个问题。
【问题讨论】:
-
跳过子查询。改为使用 case 表达式进行条件聚合。
-
我认为您可以使用附加总和,例如 select sum(case when sale_type='GOOD' AND date_of_sale BETWEEN '2017-01-01' AND '2017-12-31' then price else 0 ) ... 等等
-
在子查询中添加fruit_type条件。假设水果别名是 f1,在子查询中水果别名是 f2,然后添加 f1.fruit_type = f2.fruit_type。
-
认真考虑处理应用代码中数据显示的问题