如何用单条MySQL查询语句按月份统计盈利/亏损及总订单数?
当然可行!你当前的查询逻辑存在一点小问题——直接在CASE里套COUNT(*)没办法得到正确的盈利/亏损订单数,因为COUNT(*)会统计分组内的所有行,不管CASE的条件是否满足。咱们调整一下统计方式就能用单条查询搞定需求啦。
正确的单条查询方案
这里有两种常用的写法,都能实现你的目标:
写法一:用SUM()配合CASE表达式
这种方式是对每一行判断是否符合盈利/亏损条件,符合就记1,不符合记0,最后求和得到对应数量:
SELECT MONTH(order_time) AS month, SUM(CASE WHEN order_profit > 0 THEN 1 ELSE 0 END) AS profit_count, SUM(CASE WHEN order_profit < 0 THEN 1 ELSE 0 END) AS loss_count, COUNT(*) AS total_count FROM trade_histories WHERE order_profit IS NOT NULL GROUP BY MONTH(order_time);
写法二:用COUNT()配合CASE表达式
因为COUNT()会自动忽略NULL值,所以我们可以让不符合条件的CASE返回NULL,这样COUNT就只会统计符合条件的行数:
SELECT MONTH(order_time) AS month, COUNT(CASE WHEN order_profit > 0 THEN 1 END) AS profit_count, COUNT(CASE WHEN order_profit < 0 THEN 1 END) AS loss_count, COUNT(*) AS total_count FROM trade_histories WHERE order_profit IS NOT NULL GROUP BY MONTH(order_time);
为啥你的原查询不对?
你原来的写法里,CASE WHEN order_profit > 0 THEN COUNT(*) END其实是在分组后,对每一行判断条件,然后返回整个分组的总订单数——也就是说,只要分组里有至少一笔盈利订单,profit列就会显示该月的总订单数,否则显示NULL,这显然和你想要的“统计盈利订单数量”不符。
上面两种方法都是逐行判断条件,只统计符合要求的订单,就能得到准确的盈利、亏损和总订单数啦。
内容的提问来源于stack exchange,提问作者Khrisna Gunanasurya
相关产品推荐
相关产品推荐

