Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $YECBGYFECGEAFWHA as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2

Deprecated: imwpcache\f884414bce24ee67f\f73723ec7b1919fa5::__construct(): Implicitly marking parameter $BBWFDDBHHYHDXXAB as nullable is deprecated, the explicit nullable type must be used instead in /www/wwwroot/www.chuangxiangniao.com/wp-content/plugins/imwpcache-dist/build/f884414bce24ee67ff73723ec7b1919fa5.php on line 2
MySQL条件聚合:使用SUM与CASE语句实现字段的按条件求和_创想鸟

MySQL条件聚合:使用SUM与CASE语句实现字段的按条件求和

MySQL条件聚合:使用SUM与CASE语句实现字段的按条件求和

本教程详细介绍了如何在MySQL中实现基于特定条件的字段求和。通过结合SUM()聚合函数和CASE语句,可以精确地对满足特定条件的记录进行数值累加,例如计算特定状态下的总时长,从而解决传统SUM()无法按条件聚合的问题,极大地增强了数据查询的灵活性和精确性。

1. 问题背景与挑战

在数据库查询中,我们经常需要对某个数值字段进行求和操作。然而,有时这种求和并非针对所有记录,而是需要根据另一字段的特定条件来筛选。例如,在一个包含员工(staff)和预订(booking)信息的系统中,我们可能需要计算每个员工“已结束”(ended)状态的预订总时长,而不是所有状态的总时长。

考虑以下两个示例表结构及数据:

staff 表:| StaffID | First_name | Last_name || :—— | :——— | :——– || 1 | John | Doe || 2 | Mary | Doe |

booking 表:| BookingID | StaffID | Status | duration || :——– | :—— | :——– | :——- || 1 | 1 | cancelled | 20 || 2 | 1 | ended | 20 || 3 | 1 | ended | 10 || 4 | 2 | cancelled | 30 || 5 | 1 | confirmed | 40 |

如果使用传统的SUM(booking.duration),查询结果会累加所有状态的duration。例如,以下查询:

SELECT    s.StaffID,    s.First_name,    s.Last_name,    SUM(b.duration) AS total_duration,    COALESCE(SUM(b.Status = 'cancelled'), 0) AS cancelled_countFROM    staff sLEFT JOIN booking b ON s.StaffID = b.StaffIDGROUP BY    s.StaffID, s.First_name, s.Last_name;

其total_duration字段会计算所有预订类型的总时长(例如,StaffID为1的员工,总时长为20+20+10+40=90),而cancelled_count虽然能统计特定状态的数量,但无法实现对特定状态下duration的条件求和。我们的目标是,只计算Status = ‘ended’的duration总和。

2. 解决方案:SUM与CASE语句

解决此类条件求和问题的核心方法是结合使用SUM()聚合函数和CASE语句。CASE语句允许我们在查询中实现条件逻辑判断,根据不同的条件返回不同的值。当它与SUM()结合使用时,我们可以在条件满足时返回需要累加的数值,否则返回0(或NULL,但返回0在求和中更常见且不易出错)。

CASE语句的基本语法:

CASE    WHEN condition1 THEN result1    WHEN condition2 THEN result2    ...    ELSE default_resultEND

应用于条件求和:

为了计算Status = ‘ended’的duration总和,我们可以在SUM()函数内部构造一个CASE表达式:

SUM(CASE    WHEN booking.Status = 'ended' THEN booking.duration    ELSE 0END) AS ended_duration

这个表达式的含义是:如果booking.Status是’ended’,那么就取booking.duration的值;否则,取0。SUM()函数随后会将这些条件性取出的值进行累加。

完整的优化后SQL查询:

SELECT    staff.StaffID,    staff.First_name,    staff.Last_name,    -- 计算 Status 为 'ended' 的 duration 总和    SUM(CASE        WHEN booking.Status = 'ended' THEN booking.duration        ELSE 0    END) AS ended_duration,    -- 统计 Status 为 'cancelled' 的预订数量(保持原有功能)    COALESCE(SUM(booking.Status = 'cancelled'), 0) AS cancelled_countFROM    staffLEFT JOIN booking ON staff.StaffID = booking.StaffID -- 确保连接条件正确GROUP BY    staff.StaffID, staff.First_name, staff.Last_name;

查询解释:

SELECT staff.StaffID, staff.First_name, staff.Last_name: 选取员工的基本信息。SUM(CASE WHEN booking.Status = ‘ended’ THEN booking.duration ELSE 0 END) AS ended_duration: 这是核心部分。它遍历每个booking记录,如果Status是’ended’,则将其duration值传递给SUM进行累加;如果不是,则传递0。最终得到每个员工ended状态的总时长。COALESCE(SUM(booking.Status = ‘cancelled’), 0) AS cancelled_count: 这是一个常见的技巧,用于计算满足特定条件的记录数量。在MySQL中,布尔表达式booking.Status = ‘cancelled’在条件为真时返回1,为假时返回0,NULL时返回NULL。SUM()会累加这些1和0,从而得到计数。COALESCE用于处理没有匹配记录时SUM可能返回NULL的情况,将其转换为0。FROM staff LEFT JOIN booking ON staff.StaffID = booking.StaffID: 将staff表与booking表通过StaffID进行左连接。左连接确保即使员工没有预订记录,也会出现在结果中,其ended_duration和cancelled_count将为0。GROUP BY staff.StaffID, staff.First_name, staff.Last_name: 按照员工ID和姓名进行分组,以便为每个员工计算聚合值。

3. 示例演示

使用上述的staff和booking表数据,执行优化后的SQL查询,将得到以下结果:

StaffID First_name Last_name ended_duration cancelled_count

1JohnDoe3012MaryDoe01

结果分析:

StaffID 1 (John Doe):booking记录中,Status = ‘ended’的duration有20和10。因此ended_duration为20 + 10 = 30。Status = ‘cancelled’的记录有一条(duration 20),所以cancelled_count为1。StaffID 2 (Mary Doe):booking记录中,没有Status = ‘ended’的记录。因此ended_duration为0。Status = ‘cancelled’的记录有一条(duration 30),所以cancelled_count为1。

这完美地实现了我们最初的需求:只对“已结束”状态的预订时长进行求和。

4. 替代方案与扩展

使用IF()函数(适用于简单二元条件):对于只有两种情况的条件求和,MySQL提供了IF(condition, value_if_true, value_if_false)函数,可以作为CASE语句的简洁替代。

SUM(IF(booking.Status = 'ended', booking.duration, 0)) AS ended_duration

这个IF函数的效果与CASE WHEN … THEN … ELSE … END完全相同,但语法更简洁。

多条件求和:如果需要在同一个查询中对多个不同的条件进行求和,只需添加多个CASE表达式即可。

SELECT    staff.StaffID,    staff.First_name,    staff.Last_name,    SUM(CASE WHEN booking.Status = 'ended' THEN booking.duration ELSE 0 END) AS ended_duration,    SUM(CASE WHEN booking.Status = 'confirmed' THEN booking.duration ELSE 0 END) AS confirmed_duration,    SUM(CASE WHEN booking.Status = 'cancelled' THEN booking.duration ELSE 0 END) AS cancelled_durationFROM    staffLEFT JOIN booking ON staff.StaffID = booking.StaffIDGROUP BY    staff.StaffID, staff.First_name, staff.Last_name;

这样可以在一次查询中获取到不同状态下的聚合数据,避免多次查询,提高效率。

5. 注意事项

性能考量: CASE语句在聚合函数内部是SQL标准且通常高效的。对于非常大的数据集,其性能表现良好,因为它避免了多次扫描表或创建临时表。然而,任何复杂的查询都应在实际环境中进行性能测试。可读性: 尽管CASE语句功能强大,但过于复杂的嵌套或过多的条件可能会降低查询的可读性。适当的格式化、注释和分解复杂逻辑可以帮助维护。NULL值处理: SUM()函数在默认情况下会忽略NULL值。在CASE语句中,如果ELSE部分返回NULL而不是0,并且duration字段本身可能为NULL,则需要注意求和结果。通常,为了确保求和的准确性,当条件不满足时返回0是一个更稳健的选择。

总结

通过将SUM()聚合函数与CASE语句结合使用,我们可以在MySQL中实现高度灵活的条件聚合。这种技术是数据分析和报表生成中非常常用且强大的工具,它允许开发者根据业务逻辑精确地控制哪些数据参与到聚合计算中,从而解决传统聚合函数无法满足的复杂需求。无论是简单的二元条件还是复杂的多条件聚合,SUM(CASE WHEN … THEN … ELSE … END)模式都能提供优雅而高效的解决方案。

以上就是MySQL条件聚合:使用SUM与CASE语句实现字段的按条件求和的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1294589.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
PHP会话购物车:高效管理与正确显示商品数据
上一篇 2025年12月11日 10:21:40
PHP姓名格式化:提取首名与姓氏首字母的实用指南
下一篇 2025年12月11日 10:21:54

相关推荐

  • Sublime安装Markdown插件_Markdown写作环境配置教程

    Sublime安装Markdown插件_Markdown写作环境配置教程Sublime安装Markdown插件_Markdown写作环境配置教程Sublime安装Markdown插件_Markdown写作环境配置教程Sublime安装Markdown插件_Markdown写作环境配置教程

    首先安装MarkdownEditing和MarkdownPreview插件,可通过Package Control或手动下载完成;接着配置自定义构建系统以支持Markdown转HTML输出;最后利用MarkdownPreview实现实时浏览器预览,从而高效编写并即时查看Markdown文档。 如果您希…

    2026年9月29日 • 用户投稿
    100
  • 惠普ZBook风扇不转如何处理?专业设备维护技巧

    惠普ZBook风扇不转如何处理?专业设备维护技巧惠普ZBook风扇不转如何处理?专业设备维护技巧惠普ZBook风扇不转如何处理?专业设备维护技巧惠普ZBook风扇不转如何处理?专业设备维护技巧

    首先检查BIOS中风扇转速及温控设置,确保电源管理为高性能模式并卸载冲突软件;接着重置EC控制器并清理散热模组积尘;再检测风扇供电与接口状态,确认电压正常且连接稳固;随后评估轴承状态,必要时进行润滑或更换;最后根据型号匹配原则更换兼容风扇组件,确保系统识别与调速正常。 如果您发现惠普ZBook笔记本…

    2026年9月29日 • 用户投稿
    100
  • 快手直播怎么连麦?快手怎么申请连麦

    快手直播怎么连麦?快手怎么申请连麦快手直播怎么连麦?快手怎么申请连麦快手直播怎么连麦?快手怎么申请连麦快手直播怎么连麦?快手怎么申请连麦

    快手直播作为一款全民参与的视频直播平台,以其独特的互动性、多元化的内容以及庞大的用户群体,吸引了无数网友的追捧。而在直播过程中,连麦互动成为了拉近主播与观众距离的重要手段。本文将为您详细解析快手直播连麦的技巧,帮助您解锁互动新高度。 一、快手直播连麦的基本操作 1. 注册账号并登录 您需要在快手ap…

    2026年9月29日 • 用户投稿
    000
  • MAC的字体册怎么管理字体_macOS字体册安装、禁用与管理字体

    MAC的字体册怎么管理字体_macOS字体册安装、禁用与管理字体MAC的字体册怎么管理字体_macOS字体册安装、禁用与管理字体MAC的字体册怎么管理字体_macOS字体册安装、禁用与管理字体MAC的字体册怎么管理字体_macOS字体册安装、禁用与管理字体

    首先通过字体册安装新字体,打开应用后点击+添加.ttf或.otf文件,自动安装至“用户”集合;其次禁用不用字体以减少冲突,选中后按Command+D或右键禁用;恢复时在“禁用”分类中选字体并按Command+E启用;删除则选中字体按Delete键确认移除;最后可创建自定义集合分类管理,点击底部+新建…

    2026年9月29日 • 用户投稿
    000
  • 如何在MySQL中设计一个安全性高且易于维护的会计系统表结构以满足合规要求?

    如何在MySQL中设计一个安全性高且易于维护的会计系统表结构以满足合规要求?如何在MySQL中设计一个安全性高且易于维护的会计系统表结构以满足合规要求?如何在MySQL中设计一个安全性高且易于维护的会计系统表结构以满足合规要求?如何在MySQL中设计一个安全性高且易于维护的会计系统表结构以满足合规要求?

    如何在MySQL中设计一个安全性高且易于维护的会计系统表结构以满足合规要求? 随着数字化时代的到来,会计系统在企业中扮演着至关重要的角色。设计一个安全性高且易于维护的会计系统表结构对于确保财务数据的完整性和准确性至关重要。本文将提供一些指导原则和具体的代码示例,帮助您在MySQL中设计这样一个会计系…

    2026年9月29日 • 用户投稿
    100
  • 网络地址和ip地址区别子网掩码

    网络地址和ip地址区别子网掩码网络地址和ip地址区别子网掩码网络地址和ip地址区别子网掩码网络地址和ip地址区别子网掩码

    IP地址是设备的唯一标识,由网络和主机部分组成;网络地址表示IP所在网络的起始地址,通过IP与子网掩码进行逻辑与运算得出;子网掩码用于划分IP中网络和主机部分,如255.255.255.0对应/24,表示前24位为网络位。三者共同确定设备所属网络,是子网划分和路由的基础。 网络地址和IP地址是计算机…

    2026年9月29日 • 用户投稿
    100
  • 一门双至尊!荣耀MagicPad3 Pro平板首发第五代骁龙8至尊版:定义安卓最强平板

    一门双至尊!荣耀MagicPad3 Pro平板首发第五代骁龙8至尊版:定义安卓最强平板一门双至尊!荣耀MagicPad3 Pro平板首发第五代骁龙8至尊版:定义安卓最强平板一门双至尊!荣耀MagicPad3 Pro平板首发第五代骁龙8至尊版:定义安卓最强平板一门双至尊!荣耀MagicPad3 Pro平板首发第五代骁龙8至尊版:定义安卓最强平板

    9月25日,高通在骁龙峰会上正式揭晓了其最新旗舰移动平台——第五代骁龙8至尊版。这一发布瞬间点燃行业关注,而更引人瞩目的是,多家终端品牌随即宣布将推出搭载该芯片的新品,其中荣耀尤为抢眼。 荣耀产品线总裁方飞在峰会现场宣布:荣耀MagicPad3 Pro与荣耀Magic8系列将同步首发第五代骁龙8至尊…

    2026年9月29日 • 用户投稿
    100
  • 散热膏的涂抹方式是否会对温度结果产生显著影响?

    散热膏涂抹方式影响散热效果,常见方法有米粒法、X形法、五点法和手动涂抹法,选择合适方法需根据散热器设计、CPU顶盖平整度和散热膏粘稠度;涂抹时应控制用量、避免溢出,确保均匀覆盖,过多或不均会导致温度升高或短路风险;一般建议1-2年更换一次,并选用高导热系数、适中粘稠度、良好电绝缘性的知名品牌产品。 …

    2026年9月29日
    200
  • 抖音直播画面卡顿怎么办 抖音直播画面优化与网络调整技巧

    先确认上行网速是否达标,再优化设备编码设置。使用有线连接、关闭占用程序、开启硬编码并匹配分辨率与码率,结合平台工具调试,可有效解决抖音直播卡顿问题。 抖音直播画面卡顿,核心问题通常出在网络上传带宽不足或电脑编码性能不够。很多人以为家里宽带是千兆就一定流畅,其实直播看的是上行网速,这才是关键。下面从网…

    2026年9月29日
    100
  • 前端开发如何安装Sublime_Sublime前端环境搭建教程

    前端开发如何安装Sublime_Sublime前端环境搭建教程前端开发如何安装Sublime_Sublime前端环境搭建教程前端开发如何安装Sublime_Sublime前端环境搭建教程前端开发如何安装Sublime_Sublime前端环境搭建教程

    首先安装Sublime Text并配置Package Control插件管理器,接着安装Emmet、HTML-CSS-JS Prettify等前端插件,然后设置文件类型关联以正确识别.html、.css、.js文件语法,最后通过快捷键配置实现代码格式化功能。 如果您尝试在前端开发中使用 Sublim…

    2026年9月29日 • 用户投稿
    1700
  • 抖音广告如何精准投放?抖音投放广告价格一览

    抖音广告如何精准投放?抖音投放广告价格一览抖音广告如何精准投放?抖音投放广告价格一览抖音广告如何精准投放?抖音投放广告价格一览抖音广告如何精准投放?抖音投放广告价格一览

    在移动互联网时代,抖音作为一款热门的短视频平台,吸引了大量用户。对于广告主来说,如何在抖音平台上精准投放广告,实现高效营销,成为了亟待解决的问题。本文将为你揭秘抖音广告精准投放的秘诀,助你轻松实现营销目标。 一、了解抖音广告投放平台 1. 抖音广告投放平台:抖音广告投放平台主要包括抖音广告管家、抖音…

    2026年9月29日 • 用户投稿
    100
  • 怎么用豆包AI帮我生成Docker配置 用AI快速创建最佳容器化方案的秘诀

    怎么用豆包AI帮我生成Docker配置 用AI快速创建最佳容器化方案的秘诀怎么用豆包AI帮我生成Docker配置 用AI快速创建最佳容器化方案的秘诀怎么用豆包AI帮我生成Docker配置 用AI快速创建最佳容器化方案的秘诀怎么用豆包AI帮我生成Docker配置 用AI快速创建最佳容器化方案的秘诀

    豆包ai能高效生成并优化docker配置,关键在于提问方式和信息完整度。1. 明确应用类型、依赖及部署需求,如服务语言、数据库、端口暴露等;2. 提供现有配置文件让ai检查安全与性能问题;3. 常见优化建议包括使用alpine镜像、多阶段构建、非root运行等;4. 可要求生成不同环境的配置文件(开…

    2026年9月29日 • 用户投稿
    100
  • 小可搜搜App如何下载所需文件 小可搜搜App的离线下载步骤

    小可搜搜App如何下载所需文件 小可搜搜App的离线下载步骤小可搜搜App如何下载所需文件 小可搜搜App的离线下载步骤小可搜搜App如何下载所需文件 小可搜搜App的离线下载步骤小可搜搜App如何下载所需文件 小可搜搜App的离线下载步骤

    1、打开小可搜搜App,点击搜索框输入文件关键词,如“教学视频”或“电子书PDF”;2、在搜索结果中找到目标文件,点击进入详情页并确认信息;3、点击下载链接或“立即下载”按钮,等待下载完成即可在本地查看。此外,可复制文件链接,在App的“工具”或“下载”页进入离线下载功能,粘贴链接并新建任务,选择保…

    2026年9月29日 • 用户投稿
    300
  • windows怎么安装补丁包.msu文件_windows .msu格式补丁包的安装方法

    windows怎么安装补丁包.msu文件_windows .msu格式补丁包的安装方法windows怎么安装补丁包.msu文件_windows .msu格式补丁包的安装方法windows怎么安装补丁包.msu文件_windows .msu格式补丁包的安装方法windows怎么安装补丁包.msu文件_windows .msu格式补丁包的安装方法

    首先通过命令提示符使用wusa命令安装.msu补丁,其次可双击文件图形化安装,最后也可用PowerShell调用wusa.exe完成部署,三种方法均需按提示重启系统应用更新。 如果您下载了Windows系统的补丁包但不确定如何正确安装.msu格式的更新文件,可能是由于系统未正确识别或手动安装流程不熟…

    2026年9月29日 • 用户投稿
    100
  • 如何在Power BI中集成AI Power BI使用AI视觉分析数据

    如何在Power BI中集成AI Power BI使用AI视觉分析数据如何在Power BI中集成AI Power BI使用AI视觉分析数据如何在Power BI中集成AI Power BI使用AI视觉分析数据如何在Power BI中集成AI Power BI使用AI视觉分析数据

    在power bi中集成ai需多步骤实现,而非简单添加模块。1. 使用内置ai视觉分析功能如“分解树”和“关键影响因素”快速识别数据模式;2. 通过azure服务如anomaly detector进行复杂数据分析并可视化结果;3. 在power query中利用ai辅助清洗数据,提升效率;4. 自行…

    2026年9月29日 • 用户投稿
    100
  • 怎样为公司批量安装Sublime_Sublime企业部署安装指南

    怎样为公司批量安装Sublime_Sublime企业部署安装指南怎样为公司批量安装Sublime_Sublime企业部署安装指南怎样为公司批量安装Sublime_Sublime企业部署安装指南怎样为公司批量安装Sublime_Sublime企业部署安装指南

    首先准备标准化安装包和配置文件,再通过组策略或脚本批量部署,随后配置中央许可,最后验证安装与设置一致性。 如果您需要为公司内的多台计算机安装Sublime Text编辑器,以实现统一开发环境配置,则可以通过自动化脚本和集中化配置管理来完成批量部署。以下是实现企业级批量安装的具体步骤: 一、准备安装包…

    2026年9月29日 • 用户投稿
    400
  • 抖音笔记怎么发视频?抖音怎么发布笔记作品

    抖音笔记怎么发视频?抖音怎么发布笔记作品抖音笔记怎么发视频?抖音怎么发布笔记作品抖音笔记怎么发视频?抖音怎么发布笔记作品抖音笔记怎么发视频?抖音怎么发布笔记作品

    随着抖音的不断发展,越来越多用户选择在这个平台上记录生活、展示才华、分享创意。其中,抖音笔记作为一个融合图文与视频的多功能创作工具,正受到广泛关注。那么,抖音笔记如何发布视频内容?接下来,本文将为你全面解析操作流程。 一、发布前的准备工作 在正式发布抖音笔记视频之前,建议完成以下准备步骤: 1. 拥…

    2026年9月29日 • 用户投稿
    100
  • 为什么GPU在深度学习任务中比CPU更高效?

    为什么GPU在深度学习任务中比CPU更高效?为什么GPU在深度学习任务中比CPU更高效?为什么GPU在深度学习任务中比CPU更高效?为什么GPU在深度学习任务中比CPU更高效?

    GPU因高度并行架构和高带宽内存系统,能高效处理深度学习中海量矩阵运算,而CPU擅长串行任务,在数据预处理、模型调度等方面仍不可或缺,二者协同工作提升整体效率。 GPU在深度学习任务中表现出远超CPU的效率,核心原因在于其高度并行的架构和为大规模数据吞吐量设计的内存系统,这与深度学习中海量的矩阵运算…

    2026年9月29日 • 用户投稿
    100
  • 学校管理系统的MySQL表结构设计策略

    学校管理系统的MySQL表结构设计策略学校管理系统的MySQL表结构设计策略学校管理系统的MySQL表结构设计策略学校管理系统的MySQL表结构设计策略

    学校管理系统的MySQL表结构设计策略 目前,随着信息技术的飞速发展,学校管理系统已经成为现代学校管理的必要工具。MySQL作为一种常用的关系型数据库管理系统,在学校管理系统的开发中具有重要的地位。本文将探讨学校管理系统中MySQL表结构的设计策略,并给出具体的代码示例,旨在帮助开发人员更好地构建高…

    2026年9月29日 • 用户投稿
    100
  • Mac上怎么用Homebrew装Sublime_Homebrew安装Sublime教程

    Mac上怎么用Homebrew装Sublime_Homebrew安装Sublime教程Mac上怎么用Homebrew装Sublime_Homebrew安装Sublime教程Mac上怎么用Homebrew装Sublime_Homebrew安装Sublime教程Mac上怎么用Homebrew装Sublime_Homebrew安装Sublime教程

    首先确认Mac上已安装Homebrew,若未安装需通过官方脚本进行安装;随后使用brew install –cask sublime-text命令安装Sublime Text;最后创建软链接ln -s /Applications/Sublime Text.app/Contents/Sha…

    2026年9月29日 • 用户投稿
    100

发表回复

登录后才能评论
关注微信