表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名会员,同上,有真部长(会员)就取真部长(会员),没有则假的补满。
请各位帮忙,多谢啦
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
我用了视图,先创建视图,把三种职务的建成三个视图,查询的时候就会简单很多了。建视图的代码如下
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