2017-10-16 10 views
3

グループ化された結果セットから返されたレコードの合計数を計算しているかなり基本的なSQLクエリクエリがあります。Over()を使用したSQLラウンド番号

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機能を使用する場合、私は次のようなエラーになっています:round機能がなければThe function 'ROUND' is not a valid windowing function, and cannot be used with the OVER clause.

を、私は割合を取得するが、私は達成しようとしているように、その丸められません。

希望の結果は、小数点以下2桁です(87.95%など)。

enter image description here

答えて

2

あなただけのランキング、集計、OVERROUNDを使用することはできません、と分析関数がオーバーして使用することができます。

しかし、あなたはその後、外側のクエリで丸めを行い、サブクエリまたは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 - 更新されたクエリを試してください。 –

+0

奇妙なことに、数値が「100%」のレコードが残っています – SBB

関連する問題