灵活的CASE...WHEN:SQL同时按条件计数&按条件加和

2019-03-25  本文已影响0人  刘炎炜

背景

题目

题干

上图是了题干。简单概括如下:

你有一个DVD租赁店的订单信息数据表。关键字段有:

我们需要按月汇总这家店逐月的单量和总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大大的思(dai)路(ma)解决按条件计数不是难事,问题在于如何在不影响原值的情况下按条件加和;
  3. 这里的方法参考了这个问答,使用括号带入应有的变量名;(当然,当时本蛋在码代码的时候蠢了,判断逻辑明明可以是一样的~先就这样吧)
  4. 这个问答同时提醒我们为什么PureWeberCOUNT语句中使用了NULL,因为如果令为0确实是会计数的;
  5. SELECT后跟多个子查询应该也是可行的,就是麻烦,而且似乎显得略不优雅,因为涉及到需要多次提取月份信息重命名~

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

上一篇 下一篇

猜你喜欢

热点阅读