讲师中心 微信公众号
AI工具推荐 视频效率加速

如何在SQL中用OVER PARTITION BY同时查询明细与总计

千枫姑娘_2596

千枫姑娘_2596

发布时间:2026-09-05 12:00:30

|

524人浏览过

|

来源于php中文网

原创

使用SUM() OVER(PARTITION BY dept)可在不减少行数前提下为每行添加所属部门工资总计,避免子查询或JOIN;PARTITION BY与GROUP BY机制不同,不可混用。

如何在sql中用over partition by同时查询明细与总计

用 OVER(PARTITION BY ...) 实现明细行带分组总计

直接加 SUM() OVER(PARTITION BY ...) 就能给每行附上它所属分组的汇总值,不需要子查询或 JOIN。关键在于:窗口函数不改变行数,只在每行“旁加一列”结果。

比如查每个部门员工工资明细,同时显示该部门总工资:

SELECT 
  name, dept, salary,
  SUM(salary) OVER(PARTITION BY dept) AS dept_total
FROM employees;

注意:PARTITION BY dept 表示按 dept 分组计算,但每行仍保留原始 name 和 salary,不是聚合后的一行。

PARTITION BY 和 GROUP BY 别混用

如果同时写了 GROUP BY,又在 SELECT 里用 SUM() OVER(...),可能报错(如 PostgreSQL),或语义混乱(MySQL 8.0+ 允许但逻辑难读)。窗口函数和分组聚合是两套机制:

  • GROUP BY → 行数变少,必须用聚合函数,不能直接选非分组字段
  • OVER(PARTITION BY ...) → 行数不变,可自由选原始字段 + 窗口计算值
  • 想同时有明细、分组总计、全表总计?用多个窗口函数并列写就行

错误写法:

SELECT name, dept, SUM(salary) OVER(PARTITION BY dept) FROM employees GROUP BY dept;
(name 非分组字段,且 GROUP BY dept 后只剩部门级行)

要跨分组算累计或排名?补上 ORDER BY 子句

OVER(PARTITION BY ... ORDER BY ...) 才能支持累计、移动平均、行号等依赖顺序的操作。单纯求和、计数不需要 ORDER BY,加了反而可能影响性能(尤其大数据量时排序开销明显)。

常见组合:

  • COUNT(*) OVER(PARTITION BY dept) → 每个部门人数(每行都一样)
  • SUM(salary) OVER(PARTITION BY dept ORDER BY hire_date) → 按入职时间累加的部门工资总额
  • ROW_NUMBER() OVER(PARTITION BY dept ORDER BY salary DESC) → 部门内薪资排名

没写 ORDER BY 时,SUM、AVG 这类聚合窗口函数默认作用于整个分区(即所有同部门行),行为确定;但 ROW_NUMBER 或 LEAD 必须指定顺序,否则报错。

NULL 值和空分组会让 PARTITION BY 行为变微妙

PARTITION BY 字段为 NULL 时,所有 NULL 会被归为同一组(标准 SQL 行为)。如果业务中 dept 允许为空,那所有无部门员工会共用一个“隐式分组”,它们的 dept_total 就是这群人的工资和——这未必是你想要的。

规避方式:

  • 提前用 COALESCE(dept, 'UNKNOWN') 替换 NULL,让分组更可控
  • 加 WHERE dept IS NOT NULL 过滤(如果 NULL 确实代表无效数据)
  • 检查执行计划:某些数据库对含 NULL 的 PARTITION BY 可能无法走索引,导致窗口计算变慢

另外,空分组(即 PARTITION BY 后没匹配到任何行)不会产生结果行,这点和 GROUP BY 一致——但窗口函数本身不生成新行,所以不必担心“多出一行”。

热门AI工具

更多
UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

4363

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

911

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

1129

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

6281

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

3103

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

6260

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

8481

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

1150

2024.04.29

OpenJDK JVM参数怎么调优
OpenJDK JVM参数怎么调优

Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。

60

2026.10.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 188人学习

SQL 教程
SQL 教程

共61课时 | 7.3万人学习

MySQL优化视频教程—布尔教育
MySQL优化视频教程—布尔教育

共24课时 | 8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn