背景
- 本卤蛋小白一枚,刷题时被大家都说简单的SQL难住了,题目涉及同时按条件计数和按条件加和
- 最后靠着PureWeber大大的解答解了出来。本解法还综合了其他帖子。
- 所以本卤蛋打算来分享一下这道题,和一种思路。
题目
上图是了题干。简单概括如下:
你有一个DVD租赁店的订单信息数据表。关键字段有:
-
staff_id
:员工工号;1是个叫Mike的家伙,2是一个叫Jon的家伙 -
rental_id
: 此处可以理解为订单编号 -
amount
: 支付金额?反正是要用于加和东西但算出来又不太像💴的东西 -
payment_date
: 成交日期,只有07年一年的数据
我们需要按月汇总这家店逐月的单量和总amount情况,同时我们也需要搞清楚Mike和Jon分别经手了多少订单,分别有多少amount。因此,这就是一个既要分条件计数又要分条件加和的问题。输出结果需要的字段如下:
PS. 这个数据库运行在PostgreSQL 9.6下
一种思路
以下提供一种思路
/*
https://www.pureweber.com/article/mysql-conditional-count/
*/
SELECT
EXTRACT(month FROM payment_date) AS month,
COUNT(rental_id) AS total_count,
SUM(amount) AS total_amount,
COUNT(CASE WHEN staff_id=1 THEN 1 ELSE NULL END) AS mike_count,
SUM(CASE WHEN staff_id<>1 THEN NULL ELSE (amount) END) AS mike_amount,
COUNT(CASE WHEN staff_id=2 THEN 1 ELSE NULL END) AS jon_count,
SUM(CASE WHEN staff_id<>2 THEN NULL ELSE (amount) END) AS jon_amount
FROM payment
GROUP BY month
ORDER BY month
- 这里的思路是:整体先按月汇总,然后具体列根据需要使用
CASE...WHEN
灵活处理; - 按照PureWeber大大的思(dai)路(ma)解决按条件计数不是难事,问题在于如何在不影响原值的情况下按条件加和;
- 这里的方法参考了这个问答,使用括号带入应有的变量名;(当然,当时本蛋在码代码的时候蠢了,判断逻辑明明可以是一样的~先就这样吧)
-
这个问答同时提醒我们为什么PureWeber在
COUNT
语句中使用了NULL
,因为如果令为0确实是会计数的; -
SELECT
后跟多个子查询应该也是可行的,就是麻烦,而且似乎显得略不优雅,因为涉及到需要多次提取月份信息重命名~
本卤蛋在抓狂的时候还查询了以下帖子: