代码之家  ›  专栏  ›  技术社区  ›  Lifewithsun

SQL-百分比计算

  •  0
  • Lifewithsun  · 技术社区  · 4 年前

    我想用公式计算百分比,但在SQL中会得到不同的结果。

    查询:

     DECLARE @totHappyVote BIGINT,
             @totNuetralVote BIGINT,
             @totUnHappyVote BIGINT,
             @happyIndex DECIMAL(5, 4)
    
    DECLARE @happinessData TABLE (Id INT IDENTITY (1,1), FaceId INT)
    
    INSERT INTO @happinessData (FaceId) 
    VALUES (1), (1), (1), (2), (1), (1), (2), (2), (2), (1),
           (3), (1), (1), (3), (2), (2), (1), (1), (3), (1),
           (1), (3), (1), (2), (1), (1)
    
    SELECT 
        @totHappyVote = (COUNT(CASE WHEN h.FaceId = 1 THEN 1 ELSE NULL END)),
        @totNuetralVote = (COUNT(CASE WHEN h.FaceId = 2 THEN 1 ELSE NULL END)),
        @totUnHappyVote = (COUNT(CASE WHEN h.FaceId = 3 THEN 1 ELSE NULL END))
    FROM 
        @happinessData h
    
    SELECT 
        @totHappyVote, @totNuetralVote, @totUnHappyVote
    
    SELECT 
        'Result1'= CAST((100 * (2 * (@totHappyVote) + @totNuetralVote)) /
                      (2 * (@totHappyVote + @totNuetralVote + @totUnHappyVote)) AS NUMERIC (20, 3))
    

    当我执行查询时,它返回 Result1 作为 71.00 ; 我希望它是的确切值 71.15 .

    1 回复  |  直到 4 年前
        1
  •  3
  •   Gordon Linoff    4 年前

    SQL Server执行整数运算,因此 1 / 2 0 而不是 0.5 .

    要解决这个问题,只需更改变量的数据类型:

    DECLARE @totHappyVote NUMERIC(20, 1);
    

    数字不进行整数除法。

    请注意,如果你想要快乐比率,最简单的方法是:

    SELECT AVG(CASE WHEN h.FaceId = 1 THEN 1.0 ELSE 0 END) as happy_ratio
    FROM @happinessData h;
    

    这是总体幸福率——相对于所有行的幸福数。

        2
  •  0
  •   Lifewithsun    4 年前

    根据提供的答案添加精确的解决方案 戈登·利诺夫

    select 'Result1'= CAST((100 *(2*(AVG(CASE WHEN h.FaceId=1 THEN 1.0 ELSE 0 END)) + AVG(CASE WHEN h.FaceId=2 THEN 1.0 ELSE 0 END))) /
    (2 *(AVG(CASE WHEN h.FaceId=1 THEN 1.0 ELSE 0 END) +AVG(CASE WHEN h.FaceId=2 THEN 1.0 ELSE 0 END) + AVG(CASE WHEN h.FaceId=3 THEN 1.0 ELSE 0 END))) AS DECIMAL(5,2))
    FROM @happinessData h