SQL:选择包含在一个分组中的行

13

我正在为SQL Server编写一个查询,想知道有没有人能给我一些关于选择组成一组的单个行的提示(在这种情况下,组是基于聚合函数COUNT)。

因此,以下面的账单表为例,如果我想选择每个客户的所有账单,其中他们在特定日期之后有2个或更多的账单。

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

你认为最好的实现方式是什么?

谢谢。

3个回答

19

你将其与主表连接。

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'

6
假设您使用的是 SQL Server 2005 或更高版本,您可以使用公共表达式(common-table expression)。
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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接