2011-03-02 34 views
6

我正在研究SQL Server的查詢,我想知道是否有人可以給我一些關於選擇構成組的單個行的提示(其中組基於聚合功能,COUNT在這種情況下)SQL:選擇包含在一個組中的行

因此,作爲一個簡單的例子,如果我有一個帳單表,如下所示,我想爲每個客戶在特定日期後有兩個或更多帳單選擇所有帳單。

ClaimID  ClaimDate    ClientName 
101   May 5, 2010   Jim 
102   June 19, 2010   Jim 
103   August 5, 2008  Jim 
104   January 1, 2011  Mary 
105   May 8, 2009   Mary 
106   November 4, 2010  Mary 
107   October 6, 2010  Mary 
108   April 4, 2010   Bob 
109   April 29, 2009  Bob 
110   July 7, 2006   Joe 

所以,如果我執行

SELECT ClientName, COUNT(ClaimID) FROM Billings 
WHERE ClaimDate > '2010' 
Group By ClientName 
Having COUNT(ClaimID) > 1 

我會得到:

Jim 2 
Mary 3 

這是很好的,它發現誰在時限2周或更多的賬單所有客戶端,但我想實際列出這些帳單是什麼。 所以,我想這一點:

ClaimID ClientName Count 
101   Jim  2 
102   Jim  2 
104   Mary 3 
106   Mary 3 
107   Mary 3 

你認爲是實現這一目標的最佳方式是什麼?

謝謝。

回答

8

你加入到主表中。

SELECT B.ClaimID, B.ClaimDate, B.ClientName, G.ClaimCount 
FROM 
(
    SELECT ClientName, COUNT(ClaimID) ClaimCount 
    FROM Billings 
    WHERE ClaimDate > '2010' 
    Group By ClientName 
    Having COUNT(ClaimID) > 1 
) G 
INNER JOIN Billings B on B.ClientName = G.ClientName 
WHERE B.ClaimDate > '2010' 
1
Select ClaimID, ClientName, Count From Billings 
Where ClientName In (SELECT ClientName FROM Billings 
        WHERE ClaimDate > '2010' 
        Group By ClientName 
        Having COUNT(ClaimID) > 1) And ClaimDate > '2010' 

這將生成客戶端名稱列表,然後選擇所有具有這些名稱的客戶端的聲明。

+1

(1)'Count'是一個保留字(2)它是從子查詢缺少 – RichardTheKiwi 2011-03-02 22:53:34

4

假設SQL Server 2005或更高就可以使用一個共同的表表達式

With MultipleBillings As 
    (
    Select ClaimId, ClaimDate, ClientName 
     , Count(ClaimId) Over (Partition By ClientName) As BillingCount 
    From Billings 
    Where ClaimDate > '2010' 
    ) 
Select ClaimId, ClaimDate, ClientName 
From MultipleBillings 
Where BillingCount > 1