首页 新闻 会员 周边

遇到一个SQL查询的问题,百思不得其解。

0
悬赏园豆:50 [已关闭问题] 关闭于 2015-05-18 00:10

遇到一个SQL查询的问题,百思不得其解,特向园友求助。

 

数据结构:

表中有三个字段,用户编号、收费类型、面积类型。一个用户编号可以有多种收费类型和多种面积类型。

 

数据示例:

用户编号|收费类型|面积类型

01|A|a

01|A|b

01|B|a

01|B|c

02|C|i

05|A|g

。。。。。

 

要求:

1.查出该表中面积类型仅有a的所有用户

2.查出该表中面积类型种类数量大于2的所有用户

 

其他:该表中目前有170万条数据

程杰的主页 程杰 | 初学一级 | 园豆:92
提问于:2015-05-17 18:56
< >
分享
所有回答(3)
0

因为没有数据表,我写的表达你参照,可能有语法错误,但原理没错的。

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;

angelshelter | 园豆:9887 (大侠五级) | 2015-05-17 20:01

您好,可能我没有把第一个问题描述清楚。

第一个问题是“面积类型”仅有“a”的用户,也就是说如果该用户的“面积类型”除了“a”以外还存在别的面积类型,那么该用户不参与统计。

支持(0) 反对(0) 程杰 | 园豆:92 (初学一级) | 2015-05-17 21:23
0

1.查出该表中面积类型仅有a的所有用户

Select distinct 用户编号 from tabe where 面积类型='a'  

2.查出该表中面积类型种类数量大于2的所有用户

Select 用户编号  from table group by 用户编号

having count(面积类型)>=2

爱编程的大叔 | 园豆:30839 (高人七级) | 2015-05-17 21:29
0

自己已解决,虽然没有正确答案,但还是谢谢大家的回答。

程杰 | 园豆:92 (初学一级) | 2015-05-18 00:09

能否分享下你的正确答案啊?

支持(0) 反对(0) 隔壁老王来了 | 园豆:99 (初学一级) | 2015-05-18 08:56

@醉心: 

问题一:

 

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

支持(0) 反对(0) 程杰 | 园豆:92 (初学一级) | 2015-05-18 09:39

@程杰: 我看你第一个问题,你确定你那个是对的?加入同一编号下,有两个a的数据,那就啥也查不到了, 我觉得

SELECT 用户编号 FROM table WHERE 面积类型='a' GROUP BY 用户编号    就可以了

支持(0) 反对(0) 隔壁老王来了 | 园豆:99 (初学一级) | 2015-05-18 16:36

@程杰: 你确定你的第一条sql没有问题?group by 是用户编号,count(面积类型)实际上只是count(用户编号)本身没达到你预想的那样。

支持(1) 反对(0) angelshelter | 园豆:9887 (大侠五级) | 2015-05-21 12:10

@angelshelter: 虽然对于这批数据结果是对的,但的确和您说的一样“count(面积类型)实际上只是count(用户编号)”。谢谢提醒!

支持(0) 反对(0) 程杰 | 园豆:92 (初学一级) | 2015-05-24 12:17

@醉心: 您好,第一个问题的答案我犯了个错误,其实“count(面积类型)实际上只是count(用户编号)”。好在这批数据并没有您说的“加入同一编号下,有两个a的数据,那就啥也查不到了”这种情况。

不过您的这个语句“SELECT 用户编号 FROM table WHERE 面积类型='a' GROUP BY 用户编号”有个问题。

如果是如下数据:

用户编号 - 面积类型
0 - A面积
0 - B面积
1 - A面积

您的这条查询语句会把用户编号为"0"的用户筛选出来,不能满足第一个问题的要求。

支持(0) 反对(0) 程杰 | 园豆:92 (初学一级) | 2015-05-24 12:22

@程杰: 这个确实是我考虑不周到。我的疑问是数据会不会有这样的情况,

0 - A面积
0 - A面积

会不会存在?如果存在的话,count(用户编号)=1是不是就没效果了。

当然有可能是不存在的,那能分享下你的最终版的sql答案吗

支持(0) 反对(0) 隔壁老王来了 | 园豆:99 (初学一级) | 2015-05-25 15:32
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册