计算联接中返回的行数

时间:2016-11-23 19:52:38

标签: sql sql-server join count common-table-expression

此查询仅成功返回可能包含多行的连接的第一行。

WITH RevisionProducts AS (
    SELECT
        qr.LeadID,
        p.Code,
        ROW_NUMBER() OVER(PARTITION BY qr.LeadID ORDER BY qr.LeadID DESC) rownumber
    FROM    
        QuoteRevisions qr
        JOIN ...
)
SELECT 
    l.LeadID,
    ...
    co.Name,
    rp1.Code,
    0 AS CodeCount
FROM 
    Leads l
    JOIN Companies co on co.CompanyID = l.CompanyID
    JOIN RevisionProducts rp1 ON rp1.LeadID = l.ID AND rp1.rownumber = 1

我现在要做的就是替换......

0 AS CodeCount

...如果我们允许全部允许,那么将在联接中返回的实际行数。无法弄清楚如何做到这一点。

我不确定我是否需要CTE,但我认为它可能很方便,因为我很可能需要再次引用相同的查询来计算?

修改

好吧,看起来我需要更清楚。因此,在CTE中查询...让我们用WHERE子句运行它:

    SELECT
        qr.LeadID,
        p.Code,
        ROW_NUMBER() OVER(PARTITION BY qr.LeadID ORDER BY qr.LeadID DESC) rownumber
    FROM    
        QuoteRevisions qr
        JOIN ...
    WHERE
        qr.LeadID = 151

让我们说查询返回5行。因此,在第一个查询中,如果我们不将连接限制为仅限第一行,那么当Lead.LeadID达到151时,连接将返回5行。因此在最终数据集中,将有5行是除了rp1.Code列之外相同。

我已经将行数限制为1,这就是我想要的。但现在,我想知道将返回多少行。

我希望这更有意义。

1 个答案:

答案 0 :(得分:4)

这样的事情怎么样?

WITH RevisionProducts AS (
    SELECT
        qr.LeadID,
        p.Code,
        ROW_NUMBER() OVER(PARTITION BY qr.LeadID ORDER BY qr.LeadID DESC) rownumber
        COUNT(*) OVER(PARTITION BY qr.LeadID ) rowcount
    FROM    
        QuoteRevisions qr
        JOIN ...
)
SELECT 
    l.ID,
    ...
    co.Name,
    rp1.Code,
    rp1.rowcount AS CodeCount
FROM 
    Leads l
    JOIN Companies co on co.CompanyID = l.CompanyID
    JOIN RevisionProducts rp1 ON rp1.LeadID = l.ID AND rp1.rownumber = 1