使用 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
假设我在 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