Reputation: 211
I have the following query which (in my system) gets the total number of members who have more than 6 memberships....
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
What i need to do is left outer join the "having" part of it with a temporary table so i can get a listing of the number of members who have more than 1,2,3,4,5,6,7,8,9,10 memberships
having count(membership.memberid) > 6 <------(OUTER JOIN THIS)
I have created a temporary table to use as the join but not sure how to use it. I have also seen that using an in memory table may be more efficient than a temp table...
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
Any guidance would be appreciated.
Thank you.
Upvotes: 0
Views: 77
Reputation: 3034
You want to select the counts, and get the count of each of those (sounds weird, but it's actually very simple):
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
You mentioned that you want to get the number of members who have 1, 2, 3, etc. memberships. If that is the case, you will want to remove the following line from the query:
having count(membership.memberid) > 6
Doing so will include a count of all counts (again, sounds weird), which seems to be your requirement. Please leave a comment if you would like clarification or if I misunderstood your question.
Upvotes: 0
Reputation: 22811
Try this, using your #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
definitly it will count users with 11 memberships in every >1, >2, ..., >10 group, as requested.
Upvotes: 1
Reputation: 16575
I would do it a different way
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
Upvotes: 0