如何通过SQL分组统计(50,50)相关区域的客户占比?
嘿,我来帮你把这两个查询整合起来,轻松算出不同区域客户的占比!
首先,先纠正下你之前查询里的小疏忽——你的SQL里多写了个count,应该是FROM customerlocation而不是customerlocation count哦。
接下来,我们可以用CASE WHEN语句给每个客户打上分组标签,再结合总客户数来计算占比。这样就能一次性得到你要的所有结果,不用分开跑两个查询啦。
方案一:区分"刚好在(50,50)点"和"X<50/Y<50范围"
这个方案严格对应你之前的两个查询逻辑,同时还会统计不在这个范围内的客户:
SELECT customer_group, COUNT(*) AS customer_count, ROUND(COUNT(*) * 100.0 / total_customers, 2) AS percentage FROM ( SELECT CASE -- 精准匹配(50,50)点的客户 WHEN X_Coord = 50 AND Y_Coord = 50 THEN 'Exactly at (50,50)' -- 匹配X<50或Y<50的客户(和上面的组无重叠) WHEN X_Coord < 50 OR Y_Coord < 50 THEN 'Within (50,50) range (X<50 or Y<50)' -- 剩下的就是X>50且Y>50的客户 ELSE 'Outside (50,50) range' END AS customer_group FROM customerlocation ) AS grouped_customers -- 关联总客户数,方便计算占比 CROSS JOIN (SELECT COUNT(*) AS total_customers FROM customerlocation) AS total GROUP BY customer_group, total_customers ORDER BY percentage DESC;
方案二:拆分边界客户(X=50或Y=50但非(50,50))
如果你想把"X=50或Y=50"的客户单独拆分出来(除了(50,50)点),可以用这个版本:
SELECT customer_group, COUNT(*) AS customer_count, ROUND(COUNT(*) * 100.0 / total_customers, 2) AS percentage FROM ( SELECT CASE -- 先匹配最精准的(50,50)点 WHEN X_Coord = 50 AND Y_Coord = 50 THEN 'Exactly at (50,50)' -- 再匹配在边界但不是中心点的客户 WHEN (X_Coord = 50 OR Y_Coord = 50) AND NOT (X_Coord = 50 AND Y_Coord = 50) THEN 'On boundary (X=50 or Y=50, not both)' -- 然后是X<50或Y<50的客户 WHEN X_Coord < 50 OR Y_Coord < 50 THEN 'Within (50,50) range (X<50 or Y<50)' -- 最后是超出范围的客户 ELSE 'Outside (50,50) range' END AS customer_group FROM customerlocation ) AS grouped_customers CROSS JOIN (SELECT COUNT(*) AS total_customers FROM customerlocation) AS total GROUP BY customer_group, total_customers ORDER BY percentage DESC;
逻辑说明
CASE WHEN会按顺序匹配条件,所以一定要把最精准的条件放在前面(比如先判断是否刚好在(50,50)),避免被宽泛的条件提前匹配。CROSS JOIN总客户数的子查询,让每个分组都能拿到全局总数量,这样就能直接计算占比。ROUND(..., 2)是把百分比保留两位小数,让结果更直观;如果不需要保留小数,可以去掉这个函数。
这样跑出来的结果会清晰展示每个分组的客户数量和占总客户数的百分比,完全满足你的需求~
内容的提问来源于stack exchange,提问作者user9601393
相关产品推荐
相关产品推荐

