如何在 SQLite 中使用 COUNT() 和 GROUP BY 添加计数列
本文介绍如何在 SQLite 中结合使用 COUNT() 和 GROUP BY 子句,为查询结果集添加计数列,以便更好地分析和展示数据。
数据统计是数据库操作中最常见的需求之一。在 SQLite 中,COUNT()
配合 GROUP BY
的组合可以帮我们快速计算各类分组数据的总数,为数据分析提供有力支持。本文将详细介绍如何利用这两个关键功能来添加计数列,并通过实际示例展示各种应用场景。
为什么需要计数统计功能
在日常数据处理中,我们经常需要回答这些问题:
- 每个产品类别下有多少商品?
- 每个月有多少新用户注册?
- 不同地区的订单数量分布如何?
COUNT()
函数就像个智能计数器,而 GROUP BY
则负责将数据分类整理,两者配合就能自动完成这些统计任务。相比手动计算,这种方式不仅效率更高,而且能确保结果的准确性。
基础计数查询
让我们从最简单的计数开始,了解 COUNT()
的基本用法。
统计总记录数
SELECT COUNT(*) AS total_count FROM products;
这会返回 products 表中的总行数,结果列命名为 total_count。
统计非空值数量
SELECT COUNT(discount_price) AS discounted_items
FROM products;
这里只计算 discount_price 列不为 NULL 的记录。
分组计数统计
GROUP BY
让计数能力产生了质的飞跃,可以实现分类统计。
按单列分组计数
假设有订单表 orders:
SELECT customer_id, COUNT(*) AS order_count
FROM orders
GROUP BY customer_id;
这会显示每个客户的订单数量。
按多列分组
SELECT department, job_title, COUNT(*) AS employee_count
FROM employees
GROUP BY department, job_title;
这样可以统计各部门中不同职位的员工人数。
计数结果筛选
有时我们需要对计数结果进行二次筛选。
使用 HAVING 筛选分组
SELECT category, COUNT(*) AS product_count
FROM products
GROUP BY category
HAVING COUNT(*) > 5;
只显示包含超过 5 个产品的类别。
结合 WHERE 和 HAVING
SELECT city, COUNT(*) AS user_count
FROM users
WHERE register_date > '2023-01-01'
GROUP BY city
HAVING COUNT(*) >= 10;
统计 2023 年后注册用户数超过 10 的城市。
高级计数技巧
这些进阶用法可以解决更复杂的统计需求。
计算不同值的数量
SELECT COUNT(DISTINCT customer_id) AS unique_customers
FROM orders;
统计下单的唯一客户数量。
条件计数
SELECT
department,
COUNT(*) AS total,
COUNT(CASE WHEN salary > 8000 THEN 1 END) AS high_salary_count
FROM employees
GROUP BY department;
同时显示各部门总人数和高薪人数。
百分比计算
SELECT
category,
COUNT(*) AS count,
ROUND(COUNT(*) * 100.0 / (SELECT COUNT(*) FROM products), 2) AS percentage
FROM products
GROUP BY category;
计算各类产品占总数的百分比。
实际应用示例
让我们通过完整案例演示计数功能如何解决实际问题。
电商数据分析
-- 每月订单统计
SELECT
strftime('%Y-%m', order_date) AS month,
COUNT(*) AS order_count,
COUNT(DISTINCT user_id) AS unique_users,
SUM(total_amount) AS revenue
FROM orders
GROUP BY month
ORDER BY month;
-- 热销商品分析
SELECT
p.product_name,
COUNT(*) AS sales_count,
SUM(oi.quantity) AS total_quantity
FROM order_items oi
JOIN products p ON oi.product_id = p.id
GROUP BY p.product_name
ORDER BY sales_count DESC
LIMIT 10;
员工绩效报表
SELECT
e.department,
e.team,
COUNT(*) AS team_size,
AVG(p.sales_amount) AS avg_sales,
MAX(p.sales_amount) AS top_sales
FROM employees e
JOIN performance p ON e.id = p.employee_id
WHERE p.quarter = 'Q2-2023'
GROUP BY e.department, e.team
ORDER BY avg_sales DESC;
总结
SQLite 中的 COUNT()
和 GROUP BY
组合是数据分析的利器:
- 基础计数:快速获取记录总数或非空值数量
- 分组统计:按类别、时间等维度分类计算
- 结果筛选:使用
HAVING
对分组结果进行过滤 - 高级应用:支持去重计数、条件计数和百分比计算
实际应用中,这些功能经常与 SUM()
、AVG()
等聚合函数以及 JOIN
操作结合使用,构建出强大的数据分析查询。掌握好这些技巧,你就能轻松应对大多数数据统计需求,从海量数据中提取有价值的信息。