如何在 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 操作结合使用,构建出强大的数据分析查询。掌握好这些技巧,你就能轻松应对大多数数据统计需求,从海量数据中提取有价值的信息。