共计 1111 个字符,预计需要花费 3 分钟才能阅读完成。
背景
本卤蛋小白一枚,刷题时被大家都说简单的 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 大大的思路解决按条件计数不是难事,问题在于如何在不影响原值的情况下按条件加和;
这里的方法参考了这个问答,使用括号带入应有的变量名;
这个问答同时提醒我们为什么 PureWeber 在 COUNT 语句中使用了 NULL,因为如果令为 0 确实是会计数的;
SELECT 后跟多个子查询应该也是可行的,就是麻烦,而且似乎显得略不优雅,因为涉及到需要多次提取月份信息重命名~
本卤蛋在抓狂的时候还查询了以下帖子:
https://q.cnblogs.com/q/74846/ 感谢~