卤蛋跌跌撞撞的入门之路之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
  1. 这里的思路是:整体先按月汇总,然后具体列根据需要使用CASE...WHEN灵活处理;
  2. 按照PureWeber大大的思路解决按条件计数不是难事,问题在于如何在不影响原值的情况下按条件加和;
  3. 这里的方法参考了这个问答,使用括号带入应有的变量名;
  4. 这个问答同时提醒我们为什么PureWeber在COUNT语句中使用了NULL,因为如果令为0确实是会计数的;
  5. SELECT后跟多个子查询应该也是可行的,就是麻烦,而且似乎显得略不优雅,因为涉及到需要多次提取月份信息重命名~

本卤蛋在抓狂的时候还查询了以下帖子:

  • https://q.cnblogs.com/q/74846/ 感谢~

你可能感兴趣的:(sql,postgresql)