SQL一次性查询一个字段不同条件下的统计结果

本文介绍了一种使用SQL查询特定字段不同值下记录数量的方法,并展示了如何通过单条SQL语句实现对多个条件的计数,适用于需要快速获取统计数据的应用场景。

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

需求有如下的界面
这里写图片描述

一次、两次、三次是同一个字段的不同值下的记录条数。

查询一个一列数据可以使用下面的SQL语句。

select 
COUNT(*)
from 
shuili_company a
where 
a.check_number_ = 1
and
a.is_delete = 0 
from shuili_company GROUP BY province_

如果想用一条SQL语句将一次两次三次的同时查出来,可以使用下面的方式:

select province_, 
ifnull(
(select 
COUNT(*)
from 
shuili_company a
where 
a.check_number_ = 1
and
a.is_delete = 0 
AND
a.province_ = shuili_company.province_
)
,0) as row1,
ifnull(
(select 
COUNT(*)
from 
shuili_company a
where 
a.check_number_ = 2
and
a.is_delete = 0 
AND
a.province_ = shuili_company.province_
),0
) as row2,
ifnull((
select 
COUNT(*)
from 
shuili_company a
where 
a.check_number_ = 3
and
a.is_delete = 0 
AND
a.province_ = shuili_company.province_
),0) as row3,
ifnull((select 
COUNT(*)
from 
shuili_company a
where 
a.sel_eval_number_ = 1
and
a.is_delete = 0 
AND
a.province_ = shuili_company.province_
),0) as row4
from shuili_company GROUP BY province_
<think>好的,我现在需要解决的问题是:在Python中使用SQL,能否通过一次查询统计多个同一判断条件不同字符串。用户可能想要在一个查询里,根据某个字段不同字符串值进行统计,比如统计不同类别或状态的数量。首先,我得回想一下SQL的知识。通常,统计不同值可以用COUNT结合CASE WHEN语句或者使用FILTER子句。例如,假设有一个表orders,其中有个status字段,包含'pending', 'completed', 'cancelled'等状态,用户可能想统计每个状态的数量。 CASEWHEN方法:在SELECT子句中为每个状态写一个COUNT和CASEWHEN的组合。这样每个状态都会生成一个统计列。例如: SELECTCOUNT(CASEWHEN status = 'pending' THEN1 END) ASpending_count,COUNT(CASE WHENstatus = 'completed' THEN 1END) AS completed_count FROM orders; 这种方法可以一次性得到多个统计结果。另外,PostgreSQL支持FILTER语法,可能更简洁:COUNT(*)FILTER (WHEREstatus = 'pending') AS pending_count。 接下来要考虑如何在Python中执行这个查询。使用sqlite3模块连接数据库,创建游标,执行SQL语句,然后获取结果。可能需要先创建一个示例表,并插入一些数据来测试。然后,编写示例代码,展示如何用Python执行这样的查询。比如,创建orders表,插入测试数据,然后执行包含多个CASE WHEN的SELECT语句,获取各个状态的计数。还要考虑不同数据库的兼容性,比如MySQL是否支持FILTER子句(可能不支持),而CASE WHEN是标准SQL,兼容性更好。因此,在示例中使用CASE WHEN会更通用。 最后,解释代码的每个部分,包括连接数据库、创建表、插入数据、执行查询和获取结果。确保用户理解每个步骤的作用。 相关问题部分,需要考虑用户可能进一步想知道如何动态生成这样的查询(比如状态很多时),或者如何处理多个条件不同情况,或者不同数据库之间的差异,以及性能优化等问题。这样用户可以有更深入的学习方向。</think>可以通过使用`CASE WHEN`条件表达式配合聚合函数实现单次查询统计多个不同字符串的出现次数。以下是具体实现方案: ```python import sqlite3 # 创建内存数据库示例 conn = sqlite3.connect(':memory:') cursor = conn.cursor() # 创建示例表 cursor.execute('''CREATE TABLE orders ( id INTEGER PRIMARY KEY, product TEXT, status TEXT)''') # 插入测试数据 data = [ (1, 'Phone', 'pending'), (2, 'Laptop', 'completed'), (3, 'Tablet', 'pending'), (4, 'Watch', 'cancelled'), (5, 'Speaker', 'completed') ] cursor.executemany('INSERT INTO orders VALUES (?, ?, ?)', data) conn.commit() # 执行统计查询 query = ''' SELECT COUNT(CASE WHEN status = 'pending' THEN 1 END) AS pending_count, COUNT(CASE WHEN status = 'completed' THEN 1 END) AS completed_count, COUNT(CASE WHEN status = 'cancelled' THEN 1 END) AS cancelled_count, COUNT(CASE WHEN status NOT IN ('pending','completed','cancelled') THEN 1 END) AS other_count FROM orders ''' cursor.execute(query) result = cursor.fetchone() print(f"Pending: {result[0]}, Completed: {result[1]}, Cancelled: {result[2]}, Other: {result[3]}") ``` **代码解释:** 1. 使用`CASE WHEN`创建条件分支,对每个需要统计的状态进行判断 2. `COUNT()`函数会统计所有非NULL值,因此当条件满足时返回1,不满足时返回NULL 3. 可以同时处理已知状态和未定义状态(通过`NOT IN`条件) 4. 最终返回包含所有统计结果的单行数据 输出结果: ``` Pending: 2, Completed: 2, Cancelled: 1, Other: 0 ``` **替代方案:** PostgreSQL用户可以使用更简洁的FILTER语法: ```sql SELECT COUNT(*) FILTER (WHERE status = 'pending') AS pending_count, COUNT(*) FILTER (WHERE status = 'completed') AS completed_count FROM orders ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

陈振阳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值