2015-02-05 130 views
0

假设我在WHILE循环中创建T-SQL SELECT语句(比如说迭代年份记录)。我在SELECT中有记录的总数,以及与特定条件匹配的记录的子集计数。每个循环迭代都作为新记录添加到临时表中。使用COUNT *计算同一SELECT语句中的百分比

我可以使用COUNT(*)的总和分类汇总计算在同一个百分比选择?这将要求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

我不太懂代码,以便尽我所能提供的一般建议的[SQL服务器解析函数处理百分比]一个(https://technet.microsoft.com/en-us /library/hh213234%28v=sql.110%29.aspx)*可能*是你需要的。 – 2015-02-05 19:35:15

回答

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 
+0

我还认为,如果您将年份值与GROUP BY AVG Year一起提供给Z,那么您不必编写循环就可以插入查询结果。 – 2015-02-05 20:47:58

+0

这工作。谢谢。 – Buggieboy 2015-02-06 15:44:10