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

时间:2015-02-05 19:23:59

标签: sql-server select while-loop percentage

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

我可以使用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的方式来获得此结果?

1 个答案:

答案 0 :(得分:1)

以下是使用两个子查询时应该有效的替代方法。

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