遇到一个SQL查询的问题,百思不得其解,特向园友求助。
数据结构:
表中有三个字段,用户编号、收费类型、面积类型。一个用户编号可以有多种收费类型和多种面积类型。
数据示例:
用户编号|收费类型|面积类型
01|A|a
01|A|b
01|B|a
01|B|c
02|C|i
05|A|g
。。。。。
要求:
1.查出该表中面积类型仅有a的所有用户
2.查出该表中面积类型种类数量大于2的所有用户
其他:该表中目前有170万条数据
因为没有数据表,我写的表达你参照,可能有语法错误,但原理没错的。
select * , count(*) cc from table1 where 面积类型=a group by 用户编号 having cc = 1;
select *,count(*) cc from (select * from table1 group by 面积类型)group by 用户编号 having cc> 2;
您好,可能我没有把第一个问题描述清楚。
第一个问题是“面积类型”仅有“a”的用户,也就是说如果该用户的“面积类型”除了“a”以外还存在别的面积类型,那么该用户不参与统计。
1.查出该表中面积类型仅有a的所有用户
Select distinct 用户编号 from tabe where 面积类型='a'
2.查出该表中面积类型种类数量大于2的所有用户
Select 用户编号 from table group by 用户编号
having count(面积类型)>=2
自己已解决,虽然没有正确答案,但还是谢谢大家的回答。
能否分享下你的正确答案啊?
@醉心:
问题一:
SELECT DISTINCT 用户编号
FROM [TABLE]
WHERE 面积类型 = 'A面积'
AND 用户编号 IN ( SELECT 用户编号
FROM [TABLE]
GROUP BY 用户编号
HAVING COUNT(面积类型) = 1 )
问题二:
SELECT DISTINCT 用户编号
FROM [TABLE]
GROUP BY 用户编号
HAVING COUNT(面积类型) > 1
@程杰: 我看你第一个问题,你确定你那个是对的?加入同一编号下,有两个a的数据,那就啥也查不到了, 我觉得
SELECT 用户编号 FROM table WHERE 面积类型='a' GROUP BY 用户编号 就可以了
@程杰: 你确定你的第一条sql没有问题?group by 是用户编号,count(面积类型)实际上只是count(用户编号)本身没达到你预想的那样。
@angelshelter: 虽然对于这批数据结果是对的,但的确和您说的一样“count(面积类型)实际上只是count(用户编号)”。谢谢提醒!
@醉心: 您好,第一个问题的答案我犯了个错误,其实“count(面积类型)实际上只是count(用户编号)”。好在这批数据并没有您说的“加入同一编号下,有两个a的数据,那就啥也查不到了”这种情况。
不过您的这个语句“SELECT 用户编号 FROM table WHERE 面积类型='a' GROUP BY 用户编号”有个问题。
如果是如下数据:
用户编号 - 面积类型
0 - A面积
0 - B面积
1 - A面积
您的这条查询语句会把用户编号为"0"的用户筛选出来,不能满足第一个问题的要求。
@程杰: 这个确实是我考虑不周到。我的疑问是数据会不会有这样的情况,
0 - A面积
0 - A面积
会不会存在?如果存在的话,count(用户编号)=1是不是就没效果了。
当然有可能是不存在的,那能分享下你的最终版的sql答案吗