2011-03-02 37 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