2016-04-21 59 views
0

我有以下查询其(在我的系统)得到谁拥有超过6名成员成员总数....外连接SQL在具有查询

select count(*) as MemberCount from (
    SELECT count(membership.memberid) as MembershipCount from Membership, Package 
    WHERE membership.PackageId = Package.Id 
    AND membership.DiscountPercentage != 100 
    AND Package.PackageTypeId != 1 
    AND membership.MembershipStateId != 5 
    AND Membership.LocationId = 1 
    group by memberid 
    having count(membership.memberid) > 6 
) NonTrialMemberships 

我需要做的是左外部加入“有”的一部分与一个临时表,所以我可以得到成员数量超过1,2,3,4,5,6,7,8,9,10会员的人数列表

having count(membership.memberid) > 6 <------(OUTER JOIN THIS) 

我已经创建了一个临时表作为连接使用,但不知道如何使用它。我也看到使用内存表可能比临时表更有效率...

create table #Temp 
(
Num int, 
) 

DECLARE @i int = 0 
DECLARE @total int = 10 

WHILE @i < @total 
BEGIN 
    SET @i = @i + 1 
    Insert Into #Temp values (@i) 
END 

select * from #Temp 


select count(*) as MemberCount from (
    SELECT count(membership.memberid) as MembershipCount from Membership,  Package 
    WHERE membership.PackageId = Package.Id 
    AND membership.DiscountPercentage != 100 
    AND Package.PackageTypeId != 1 
    AND membership.MembershipStateId != 5 
    AND Membership.LocationId = 1 
    group by memberid 
    having count(membership.memberid) > 6 
) NonTrialMemberships 




If(OBJECT_ID('tempdb..#temp') Is Not Null) 
Begin 
    Drop Table #Temp 
End 

任何指导,将不胜感激。

谢谢。

回答

1

试试这个,使用#TEMP。

select #temp.num, count(*) 
from #temp 
left join 
    (
    SELECT count(membership.memberid) as MembershipCount from Membership, Package 
    WHERE membership.PackageId = Package.Id 
    AND membership.DiscountPercentage != 100 
    AND Package.PackageTypeId != 1 
    AND membership.MembershipStateId != 5 
    AND Membership.LocationId = 1 
    group by memberid 
    having count(membership.memberid) > 1 
    ) ntm 
on ntm.MembershipCount > #temp.num 
group by #temp.num 

明确地说,它会按照要求对每个> 1,> 2,...,> 10组中的11个成员进行计数。

+0

感谢你这样..我认为你已经为我加入了联合:) –

0

我会做它用不同的方式

SELECT [MembershipCount], Count(1) FROM 
(
     SELECT count(membership.memberid) as MembershipCount from Membership,  Package 
     WHERE membership.PackageId = Package.Id 
     AND membership.DiscountPercentage != 100 
     AND Package.PackageTypeId != 1 
     AND membership.MembershipStateId != 5 
     AND Membership.LocationId = 1 
     group by memberid 
) 
order by Count(1) Desc 
+0

我喜欢你的答案,但我认为你应该修改这个查询来在外部查询中添加一个'group by'。另外,我认为OP只需要'WHERE MembershipCount <= 10'。 – user212514

+1

这将只计算每个用户一次,这与OP的“获取超过** 1,2,3,4,5,6,7,8,9,10会员的**成员数量列表不一致”。 – Serg

0

您要选择的数量,并获得每那些的计数(听起来不可思议,但它实际上是非常简单):

SELECT MemberCount, Count(*) 
FROM 
(
     SELECT count(membership.memberid) as MemberCount 
     FROM Membership, Package 
     WHERE membership.PackageId = Package.Id 
     AND membership.DiscountPercentage != 100 
     AND Package.PackageTypeId != 1 
     AND membership.MembershipStateId != 5 
     AND Membership.LocationId = 1 
     group by memberid 
     having count(membership.memberid) > 6 
) t 
group by MemberCount 
order by MemberCount 

您提到要得到谁拥有的会员数1,2,3等会员资格。如果是这样的话,你会想从查询中删除以下行:

having count(membership.memberid) > 6 

这样做将包括所有计数的计数(再次,听起来有些不可思议),这似乎是您的要求。如果您需要澄清,或者我误解了您的问题,请留下评论。

+0

如果没有会员有6个会员,那么这将不会“计数”这个号码。 –

+0

@ChristopherPettigrew请阅读我的整个答案。我解释说,通过删除“有数(membership.memberid)”6“行,您将包括成员的所有计数... –

+0

即使删除它也不起作用。如果我的会员有1,2,3和4个成员,最后有10个成员,那么这个小组将会忽略这个计数... [link](http://postimg.org/image/4j4a6pdh3/) –