使用 COUNT * 计算同一 SELECT 语句中的百分比

Use COUNT * To Calculate Percentage In Same SELECT Statement

假设我在 WHILE 循环中创建了 T-SQL SELECT 语句(比如迭代年记录)。我有 SELECT 中的记录总数,以及符合特定条件的记录子集的计数。每个循环迭代都作为新记录添加到临时 table。

我可以使用 COUNT(*) 总计和小计计算同一 SELECT 中的百分比 吗?这将要求 SELECT 中的求值顺序是确定性的——即先出现的先求值。示例:

WHILE @yr < @CurrYr BEGIN
     INSERT INTO @tmpMatches(total_ct, match_ct, pct_match, yr
                             -- some other fields
                            )
        SELECT COUNT(*) AS total_ct,
            SUM(IIF(cd.is_matched = 1, 1, 0)) AS match_ct,
            ( CASE
                WHEN (total_ct > 0)
                    THEN (((@tmp_match_ct * 1.0) / 
                           (@tmp_total_ct * 1.0)) * 100)
                    ELSE 0
              END
            ) AS pct_match, 
            @yr
        FROM candidate cd
            INNER JOIN -- ...
        WHERE -- ...
           AND YEAR(closing_dt) = @yr
   SET @yr = @yr + 1;
-- ...
END -- while

如果我不能依赖评估顺序,在我看来我必须在这个之前有一个类似的 SELECT 语句,以便在 运行 上面显示的语句。

无论如何,是否有更清晰、更SQL的方式来获得这个结果?

这是一个应该使用两个子查询的替代方法。

SELECT
    total_ct,
    match_ct,
    pct_match=CASE WHEN (total_ct>0) THEN ... ELSE 0 END
FROM
(
    SELECT
        total_ct=COUNT(*),
        match_ct=SUM(MatchedFlag)
    FROM
    (
        SELECT
            someid,
            MatchedFlag=CASE WHEN is_matched=1 THEN 1 ELSE 0 END
        FROM
            candidate cd
    )AS Z   
)AS Y