2016-04-21 63 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/) –