You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用单条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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:24:44