mysql根据某个字段的不同状态的值进行统计

本文介绍如何使用SQL查询来统计特定用户在不同订单状态下的订单数量,包括抢票数、开票数和驳回数。通过CASE WHEN语句结合SUM函数实现状态的条件筛选。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

场景:status有5个状态:1:未办理,2:开票中,3:开票完成,4:开票请求驳回, 5:已邮寄, 5:已自提

根据不同状态统计某个用户的订单数。统计所有状态都有为抢票数,统计status=3为开票数,统计status=4为驳回数。查询某个用户对应的开票数,抢单数,驳回数。

SQL:

SELECT
COUNT(order_no) as qiangdan,
SUM(CASE WHEN order_status = '3' or order_status = '5' THEN 1 ELSE 0 END) as jaipiao,
SUM(CASE WHEN order_status = '4' THEN 1 ELSE 0 END) as reject
FROM tb_tax_order
WHERE station_staff_id = '6'

查询结果:

 

 

注意:函数不能嵌套函数使用,比如不能 SUM(CASE WHEN order_status = '4' THEN COUNT(order_no) ELSE 0 END),这是错误的。

 

 

 

<think>我们被要求使用MySQL的GROUP BY和COUNT统计某个字段相同的出现次数。根据用户问题,他想统计表中某个字段(假设字段名为`column_name`)的每个不同出现的次数。基本语法: SELECTcolumn_name,COUNT(*)AS countFROMtable_nameGROUPBY column_name;解释:1.SELECT后面跟着我们要统计字段名,以及使用COUNT(*)来统计每个分组中的行数。2. FROM指定表名。3.GROUP BY后面跟着分组依据的字段名,这里就是我们要统计字段。注意:COUNT(*)会统计每个分组中的行数,即每个字段出现的次数。例如,假设有一个学生表(students),其中有一个字段是班级(class),我们想统计每个班级的学生人数,可以这样写: ```sqlSELECT class, COUNT(*) ASstudent_countFROMstudentsGROUP BYclass;```结果将显示每个班级的名称和该班级的学生人数。另外,根据引用[1]和[5]中提到,MySQL允许SELECT子句中出现没有在GROUPBY中出现的字段,但这通常是通过功能扩展实现的,标准SQL不允许。在我们的场景中,我们只选择分组字段和聚合函数,这是标准SQL允许的。如果用户需要按照多个字段分组,则可以在GROUP BY后面列出多个字段,用逗号分隔。例如,按班级和性别分组统计:```sqlSELECTclass,gender,COUNT(*)AS countFROMstudentsGROUP BYclass,gender;```但用户当前的问题只需要按一个字段分组。因此,针对用户的问题,我们给出如下示例代码:假设表名为`my_table`,字段名为`my_column`,则:```sqlSELECTmy_column, COUNT(*) AScountFROM my_tableGROUP BYmy_column; ```这样就会返回两列:一列是`my_column`的不同,另一列是对应出现的次数(命名为`count`)。注意:如果字段为NULL,那么NULL也会被作为一个分组。如果想排除NULL,可以在WHERE子句中过滤:```sqlSELECTmy_column, COUNT(*) AScountFROM my_tableWHERE my_column ISNOT NULLGROUPBY my_column;```或者,如果只想统计非NULL的出现次数,但保留NULL作为一个分组,那么直接使用上述第一个查询即可(因为COUNT(*)会统计包括NULL在内的行,但如果是COUNT(my_column)则只统计非NULL,但这里我们统计的是行数,所以用COUNT(*))。但是,如果用户想统计的是该字段非NULL的出现次数,并且不想在结果中出现NULL分组,则使用WHERE过滤。因此,我们可以根据用户的具体需求调整。现在,我们按照要求生成相关问题。</think>### MySQL统计字段相同的出现次数 要统计MySQL表中某个字段相同的出现次数,可以使用`GROUP BY`结合`COUNT()`聚合函数实现。基本语法如下: ```sql SELECT column_name, COUNT(*) AS count FROM table_name GROUP BY column_name; ``` #### 示例说明: 假设有学生表`students`: | id | name | class | |----|------|-------| | 1 | 张三 | A | | 2 | 李四 | B | | 3 | 王五 | A | | 4 | 赵六 | A | 统计每个班级的学生数量: ```sql SELECT class, COUNT(*) AS student_count FROM students GROUP BY class; ``` 执行结果: | class | student_count | |-------|---------------| | A | 3 | | B | 1 | #### 关键点解析: 1. **`GROUP BY`分组**:将相同字段的记录归为一组 2. **`COUNT(*)`计数**:统计每个分组中的记录数量 3. **别名使用**:`AS count`为结果列赋予可读性名称 #### 进阶用法: 1. **多字段分组统计**(引用[5]): ```sql SELECT class, gender, COUNT(*) FROM students GROUP BY class, gender; ``` 2. **过滤空统计**: ```sql SELECT class, COUNT(*) FROM students WHERE class IS NOT NULL GROUP BY class; ``` 3. **结果排序**: ```sql SELECT class, COUNT(*) AS count FROM students GROUP BY class ORDER BY count DESC; ``` > 注意:MySQL允许`SELECT`未出现在`GROUP BY`中的字段(引用[1]),但标准SQL不允许此操作。建议仅选择分组字段和聚合函数以保证结果准确性。 #### 实际应用场景: 1. 统计商品分类下的产品数量 2. 分析用户地域分布 3. 计算订单状态分布 4. 汇总日志错误类型出现频率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iamlzjoco

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值