2017-10-16 71 views
3

我有一个非常基本的SQL查询查询,它正在对从分组结果集返回的记录总数进行计算。SQL Round Number Over()

SELECT vco.OutcomeName, 
      vco.VersionCompareOutcomeID, 
      COUNT(t.OutcomeName) AS Total, 
      ROUND(COUNT(*) * 100.0/sum(count(*)), 1) over() AS Percentage 
FROM map.VersionCompareOutcome AS vco 
LEFT JOIN @temp AS t 
ON vco.VersionCompareOutcomeID = t.VersionCompareOutcomeID 
GROUP BY vco.OutcomeName, vco.VersionCompareOutcomeID 

当我尝试并使用round功能,我收到以下错误:The function 'ROUND' is not a valid windowing function, and cannot be used with the OVER clause.

没有round功能,我得到的百分比,但其不圆像我想要的目的。

我希望的结果是小数点后两位:例如87.95%

enter image description here

回答

2

不能使用ROUNDOVER,只有聚集,排名和分析功能可经由使用。

但是,你可以做你聚集在一个子查询或CTE,然后做在外部查询取整:

WITH CTE 
AS 
(

    SELECT vco.OutcomeName, 
       vco.VersionCompareOutcomeID, 
       COUNT(t.OutcomeName) AS Total 
    FROM map.VersionCompareOutcome AS vco 
    LEFT JOIN @temp AS t ON vco.VersionCompareOutcomeID = t.VersionCompareOutcomeID 
    GROUP BY vco.OutcomeName, vco.VersionCompareOutcomeID 
) 
SELECT 
    OutcomeName, 
    VersionCompareOutcomeID, 
    Total, 
    CASE WHEN (SELECT COUNT(*) FROM @temp) = 0 THEN 0 ELSE ROUND(Total * 100.0/(SELECT COUNT(*) FROM @temp), 1) END AS Percentage 
FROM CTE 
+0

我试图整合这一点,但我正在遇到一个错误'被零除错误.'。可能有一个情况是我的总数是'0',所以我需要显示'0%'作为百分比。这在我的例子中可以解释吗? – SBB

+0

@SBB - 尝试更新后的查询。 – 2017-10-16 18:12:48

+0

奇怪的是,结果总是说数字记录是'100%' – SBB