假设我在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的方式来获得此结果?
答案 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