SQL作业求助:为客户代表统计查询添加邮政编码筛选条件
搞定这个SQL问题很简单!
你已经写对了核心的分组统计逻辑,只需要在筛选条件里加上邮政编码的判断就行啦~不过这里要注意邮政编码字段的类型,分两种常见情况给你说明:
情况1:邮政编码是字符串类型(比如VARCHAR)
如果你的邮编字段存在字符串类型里,直接用LIKE匹配开头字符就可以:
SELECT cust_rep, count(cust_nbr) as "CustomerCount" FROM customer WHERE cust_rep < 100 AND (zip_code LIKE '0%' OR zip_code LIKE '9%') -- 新增邮编筛选条件 GROUP BY cust_rep ORDER BY cust_rep;
用括号把两个LIKE条件括起来,确保逻辑优先级正确——意思是同时满足「客户ID小于100」并且「邮编以0或9开头」的客户才会被统计。
情况2:邮政编码是数字类型(比如INT)
如果邮编存在数字字段里,有两种处理方式:
方法A:转成字符串再匹配
SELECT cust_rep, count(cust_nbr) as "CustomerCount" FROM customer WHERE cust_rep < 100 AND (CAST(zip_code AS VARCHAR) LIKE '0%' OR CAST(zip_code AS VARCHAR) LIKE '9%') GROUP BY cust_rep ORDER BY cust_rep;
用CAST函数把数字转成字符串,就能复用上面的LIKE逻辑了。
方法B:用数学运算提取第一位数字(适合固定位数的邮编,比如5位)
SELECT cust_rep, count(cust_nbr) as "CustomerCount" FROM customer WHERE cust_rep < 100 AND FLOOR(zip_code / 10000) IN (0, 9) GROUP BY cust_rep ORDER BY cust_rep;
比如5位邮编90210,除以10000后取整得到9,01234取整得到0,这样就能判断第一位是不是0或9了。
额外补充:如果要显示所有ID<100的代表(哪怕没有符合条件的客户)
如果你的需求是不管代表有没有服务符合邮编条件的客户,都要列出他的ID并显示0,那可以用子查询加LEFT JOIN:
SELECT cr.cust_rep, COUNT(CASE WHEN c.zip_code LIKE '0%' OR c.zip_code LIKE '9%' THEN c.cust_nbr END) AS "CustomerCount" FROM (SELECT DISTINCT cust_rep FROM customer WHERE cust_rep <100) cr LEFT JOIN customer c ON cr.cust_rep = c.cust_rep GROUP BY cr.cust_rep ORDER BY cr.cust_rep;
内容的提问来源于stack exchange,提问作者Kendall O'Connor
相关产品推荐
相关产品推荐

