京东11.11大促主会场领京享红包更优惠

 找回密码
 立即注册

QQ登录

只需一步,快速开始

解读SQL中GROUP BY和HAVING子句中利用NULL条件题目

2024-11-4 00:31| 发布者: 76a9| 查看: 125| 评论: 0

摘要: 目次SQL中GROUP BY和HAVING子句中利用NULL条件1. HAVING batch IS NULL 没有数据的原因2. HAVING SUM(CASE WHEN batch IS NULL THEN 1 ELSE 0 END) > 0 结果正确的原因总结增补SQL中GROUP BY和HAVING子句中利用NULL
目次

SQL中GROUP BY和HAVING子句中利用NULL条件

  • SQL :
[code]SELECT COUNT(1), tid, sap_do, batch, skucode,batch FROM lt WHERE IFNULL(sap_do, '') != '' AND created_time >= 1722441600 GROUP BY tid, sap_do, skucode HAVING COUNT(1) > 1 AND batch IS NULL; [/code]

查询结果为空;现实数据库存在batch IS NULL的

  • 修改后:
[code]SELECT COUNT(1), tid, sap_do, skucode, batch FROM lt WHERE IFNULL(sap_do, '') != '' AND created_time >= 1722441600 GROUP BY tid, sap_do, skucode HAVING COUNT(1) > 1 AND SUM(CASE WHEN batch IS NULL THEN 1 ELSE 0 END) > 0;[/code]

题目的核心在于 GROUP BY 和 HAVING 子句的工作方式,以及 NULL 的处理规则

1. HAVING batch IS NULL 没有数据的原因

当你利用 GROUP BY 并在 HAVING 子句中直接利用 batch IS NULL,SQL 会在分组后的结果中查找 batch 的值是否为 NULL。但是由于 GROUP BY 会对全部同一组内的数据举行聚合,batch 字段可能包罗 NULL 和非 NULL 的混淆值。

对于 GROUP BY 而言,它不会简朴地保存 batch 字段的某一个特定值,因此如果某个分组内的 batch 值既有 NULL 又有非 NULL 的情况,batch IS NULL 这个条件会失效,由于 SQL 无法确定这一组的 batch 值究竟是 NULL 照旧非 NULL。

直接利用 HAVING batch IS NULL 通常只能在整个分组的 batch 全部是 NULL 的情况下才会见效。

简而言之,当 batch 列在分组后不满是 NULL 时,HAVING batch IS NULL 无法筛选出结果。

2. HAVING SUM(CASE WHEN batch IS NULL THEN 1 ELSE 0 END) > 0 结果正确的原因

SUM(CASE WHEN batch IS NULL THEN 1 ELSE 0 END) 的逻辑是通过 CASE 语句来计算某个分组内 batch 列为 NULL 的记载数。

SUM 是对整个分组内的每一条记载举行处理,因此即使该组内存在 batch 的非 NULL 值,只要有任何一条记载的 batch 是 NULL,SUM 就能正确计算出这一组包罗 NULL 值的数量。

表明:

  • SUM(CASE WHEN batch IS NULL THEN 1 ELSE 0 END) > 0:通过这个 SUM,我们计算出当前分组内有多少条记载的 batch 为 NULL,如果结果大于 0,说明这一组内存在 NULL 值的 batch。
  • HAVING batch IS NULL:只能筛选出分组后 batch 的值完全为 NULL 的情况,无法处理那些包罗 NULL 和非 NULL 值的分组。

总结

HAVING batch IS NULL 只能处理整个分组中的 batch 全为 NULL 的情况,这在有混淆值的分组中会导致结果为空。

HAVING SUM(CASE WHEN batch IS NULL THEN 1 ELSE 0 END) > 0 可以处理分组中包罗 NULL 和非 NULL 的情况,因此它能正确返回包罗 NULL 值的分组。

这种 SUM(CASE WHEN…) 逻辑提供了更细粒度的控制,可以确保即使在分组中存在多个差别的 batch 值,依然可以正确识别出那些包罗 NULL 的分组。

增补

如果查询id字段的话 上面的SQL结果会发现,id结果不是我们想要的batch为null的行ID

可改造SQL为下面 实行:

[code]SELECT id, tid, sap_do, skucode, batch FROM lt WHERE batch IS NULL AND (tid, sap_do, skucode) IN ( SELECT tid, sap_do, skucode FROM lt WHERE IFNULL(sap_do, '') != '' AND created_time >= 1725120000 GROUP BY tid, sap_do, skucode HAVING COUNT(1) > 1 AND SUM(CASE WHEN batch IS NULL THEN 1 ELSE 0 END) > 0 ); [/code]

以上为个人履历,希望能给各人一个参考,也希望各人多多支持脚本之家。


来源:https://www.jb51.net/database/328891uv5.htm
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
关闭

站长推荐上一条 /6 下一条

QQ|手机版|小黑屋|梦想之都-俊月星空 ( 粤ICP备18056059号 )

GMT+8, 2025-4-4 23:28 , Processed in 0.026699 second(s), 17 queries .

Powered by Mxzdjyxk! X3.5

© 2001-2025 Discuz! Team.

返回顶部