首页 新闻 会员 周边

sql查询问题

0
悬赏园豆:50 [已关闭问题] 关闭于 2012-01-31 19:36

表User:

Id(int)  

Name(nvarchar(50))

ClubId(int)  (俱乐部)

PostId(int)  (职务 1.会长 2.部长 3.会员)

IsPreset(bit)  (是否预置用户 ,如开始会预先设置一个假会长和其他假会员⊙﹏⊙b汗)

Status(int)  (1.正常 2.冻结 3.删除)

User数据:

Id  Name  ClubId  PostId  IsPreset  Status

1   李明    1    1      true    1

2   王涛    1    1      false     1

3   郭晨    1    2      false     1

4   刘云    1    3      true    1

....

另有 Club表 Id Name Status

现在需求是:

1.查询每个Club的1名会长,如果有真会长则取真会长,没有则取假会长。

2.查询某个Club的1名会长,2名部长,10名会员,同上,有真部长(会员)就取真部长(会员),没有则假的补满。

 

请各位帮忙,多谢啦

失落小羊的主页 失落小羊 | 初学一级 | 园豆:58
提问于:2011-10-27 11:43
< >
分享
所有回答(2)
0

 select u.[name]  ,case when IsPreset='true'  then u.[Name] else u.[Name] end
 from  [User] as u  join Club as c  on ClubId=Id
group by c.ClubId  大致好像是这样的 没有验证,思路我觉得是 级联这两张表,然后根据 ClubId 来分组,

再来判断 是否是真会长和假会长! 用case when ~~ then  ~~ ese ~~ end

风宝 | 园豆:205 (菜鸟二级) | 2011-10-27 15:48
0

我用了视图,先创建视图,把三种职务的建成三个视图,查询的时候就会简单很多了。建视图的代码如下

create view HZUser
as
select * from [User] where PostId=1 and Status =1

create view BZUser
as
select * from [User] where PostId=2 and Status =1

create view HYUser
as
select * from [User] where PostId=3 and Status =1

然后我就可以很简单的查询了,比如你的第1点,我写的sql就是:

SELECT * FROM HZUser WHERE
(
SELECT COUNT(1) FROM HZUser a WHERE HZUser.ClubId = a.ClubId and HZUser.IsPreset<a.IsPreset
) < 1 -- 具体要前多少,修改这个数字。

第二点其实就是按上面一句sql用union all联接起来就行了,如下:

select * from 
(
SELECT *,'会长' as [role] FROM HZUser WHERE
(
SELECT COUNT(1) FROM HZUser a WHERE HZUser.ClubId = a.ClubId and HZUser.IsPreset<a.IsPreset
) < 1 -- 具体要前多少,修改这个数字。
Union all
SELECT *,'部长' as [role] FROM BZUser WHERE
(
SELECT COUNT(1) FROM BZUser a WHERE BZUser.ClubId = a.ClubId and BZUser.IsPreset<a.IsPreset
) < 2 -- 具体要前多少,修改这个数字。
Union all
SELECT *,'会员' as [role] FROM HYUser WHERE
(
SELECT COUNT(1) FROM HYUser a WHERE HYUser.ClubId = a.ClubId and HYUser.IsPreset<a.IsPreset
) < 10 -- 具体要前多少,修改这个数字。
) bb
order by bb.ClubId,bb.PostId,bb.IsPreset
LCM | 园豆:6876 (大侠五级) | 2011-10-27 16:37
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册