乐趣区

卤蛋跌跌撞撞的入门之路之SQL按条件计数&按条件加和

背景

本卤蛋小白一枚,刷题时被大家都说简单的 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/ 感谢~

退出移动版