程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

掌握这个 SQL 查询技巧,精确筛选符合条件的数据!

balukai 2025-03-23 17:14:23 文章精选 11 ℃

引言:

找出表中所有 custid,其中每个custid的 market 值只包含 '1' 和 '2',并且这两个值都必须出现。若custid 的 market 字段中有其他值,该custid就不会被返回。

SELECT custid
FROM table
GROUP BY custid
HAVING SUM(CASE WHEN market IN ('1', '2') THEN 1 ELSE 0 END) = COUNT(*) 
   AND COUNT(DISTINCT market) = 2;


sql语句解析:

SELECT custid FROM table
  • 表示从表 table 中选择 custid 字段。


GROUP BY custid
  • 表示对结果按照 custid 字段进行分组。即对每个客户(custid)的数据进行汇总。


HAVING子句
  • HAVING 用来过滤分组后的数据,它类似于 WHERE 子句,但是是对分组后的结果进行过滤的。


SUM(CASE WHEN market IN ('1', '2') THEN 1 ELSE 0 END) = COUNT(*)
  • 检查每个客户 (custid) 的所有 market 值是否只包含 '1' 和 '2',即如果该客户的所有记录中 market 值包含 '1' 或 '2' 以外的其他值(比如 'A'),这个条件就不成立。
  • SUM(CASE WHEN market IN ('1', '2') THEN 1 ELSE 0 END) 计算的是该 custid 中,market 字段为 '1' 或 '2' 的记录数。
  • COUNT(*) 是该客户所有记录的数量。
  • 如果这两个数相等,说明该客户的所有记录中的 market 值都在 '1' 和 '2' 中。


COUNT(DISTINCT market) = 2
  • 确保每个客户的 market 字段中有且只有两个不同的值——'1' 和 '2'。
  • 如果 market 中有更多(或更少)的不同值(比如 '1','2' 和 'A'),这个条件将不成立,客户会被排除。
最近发表
标签列表