当需要从同一表中获取不同分组条件的统计结果时,可以通过以下几种方式将多条SQL合并为一条:
SELECT
department_id,
job_id,
COUNT(*) as emp_count,
SUM(salary) as total_salary
FROM employees
GROUP BY GROUPING SETS (
(department_id),
(job_id),
()
);
这会返回三个结果集的并集: 1. 按department_id分组的结果 2. 按job_id分组的结果 3. 不分组的总计结果
SELECT
department_id,
job_id,
COUNT(*) as emp_count,
SUM(salary) as total_salary
FROM employees
GROUP BY CUBE (department_id, job_id);
CUBE会生成所有可能的分组组合,包括: - 按department_id分组 - 按job_id分组 - 按department_id和job_id组合分组 - 不分组的总计
SELECT
department_id,
job_id,
COUNT(*) as emp_count,
SUM(salary) as total_salary
FROM employees
GROUP BY ROLLUP (department_id, job_id);
ROLLUP生成层次化的分组结果,从最详细到总计。
SELECT 'department' as group_type, department_id as group_id,
COUNT(*) as emp_count, SUM(salary) as total_salary
FROM employees
GROUP BY department_id
UNION ALL
SELECT 'job' as group_type, job_id as group_id,
COUNT(*) as emp_count, SUM(salary) as total_salary
FROM employees
GROUP BY job_id
UNION ALL
SELECT 'total' as group_type, NULL as group_id,
COUNT(*) as emp_count, SUM(salary) as total_salary
FROM employees;
选择哪种方法取决于具体需求、数据库支持情况和性能考虑。