【问题标题】:How do I calculate percentages with decimals in SQL?如何在 SQL 中计算带小数的百分比?
【发布时间】:2020-01-11 03:57:29
【问题描述】:

如何在 SQL 中将其转换为小数?下面是等式,我得到的答案是 78(整数),但真正的答案是 78.6(带小数)所以我需要显示这个,否则报告不会达到 100%

(100 * [TotalVisit1]/[TotalVisits]) AS Visit1percent

【问题讨论】:

    标签: sql decimal sum


    【解决方案1】:

    试试这个:

    (100.0 * [TotalVisit1]/[TotalVisits]) AS Visit1percent
    

    【讨论】:

    • 确保在表示层中添加格式以将其四舍五入到小数点后 1 位或 2 位。否则,你很可能会遇到类似 33.33333...
    【解决方案2】:
    convert(decimal(5,2),(100 * convert(float,[TotalVisit1])/convert(float,[TotalVisits]))) AS Visit1percent
    

    丑陋,但它有效。

    【讨论】:

    • 谢谢这是我在四舍五入时使用的那个,其他答案都很好,尽管感谢每个人:)
    • 我发现转换为十进制比浮点数更好。至少在 Microsoft SQL 服务器上,某些除法使用十进制效果更好:SELECT 5555/CAST(1000 AS float), CAST(5555/CAST(1000 AS float) AS numeric(5, 2)), 5555/CAST(1000 AS decimal ), CAST(5555/CAST(1000 AS decimal) AS Numeric(5, 2))
    【解决方案3】:
    CAST(ROUND([TotalVisit1]*100.0/[TotalVisits],2)as decimal(5,2)) as Percentage
    


    不丑,工作更好更快,享受吧!

    【讨论】:

      【解决方案4】:

      至少在 MySQL 中(如果有帮助的话),如果你想使用浮点数,你必须使用浮点类型字段,而不是常规的 int 字段。

      【讨论】:

        【解决方案5】:

        只需在 100 上加一个小数

        (100.0 * [TotalVisit1]/[TotalVisits]) AS Visit1percent
        

        这会强制所有处理都在浮点数中进行...如果您希望最终输出为文本,并被截断以仅显示一位小数,请使用 Str 函数

        Str( 100.0 * [TotalVisit1]/[TotalVisits], 4, 1 ) AS Visit1percent
        

        【讨论】:

        • 喜欢你的 str 答案漂亮整洁:)
        • 谢谢先生! ...很高兴为您提供帮助
        【解决方案6】:

        这对我来说非常适合:

        CAST((1.0 * SUM(ColumnA) /COUNT(ColumnB)) as decimal(5,2))
        

        希望它可以帮助世界上的某个人。

        【讨论】:

          【解决方案7】:

          这样做可能有点矫枉过正,但您可能希望考虑将所有值转换为浮点数以确保所有阶段的准确性。

          (100.0 * ( [TotalVisit1]+0.0 )/([TotalVisits]+0.0) ) as Visit1percent
          

          注意,对于 TotalVisits == 0 的情况,您确实需要在此处输入代码,否则您将得到除以 0 的答案。

          【讨论】:

            【解决方案8】:
            SELECT(ROUND(CAST(TotalVisit1 AS DECIMAL)/TotalVisits,1)) AS 'Visit1percent'
            

            这将返回一个小数,而 ROUND 会将其四舍五入为一位数。所以在你的情况下,你会得到 76.6。如果您不想要任何数字,请将 1 更改为 0,如果您想要两位数,请将其更改为 2。

            【讨论】:

              【解决方案9】:

              试试这个,不要round和str或Over()。我发现这是一种更简单的方法。

              cast((count(TotalVisit1) * 100.0) /TotalVisits as numeric(5,3))  as [Visit1percent]
              

              您可以根据需要更改小数位数

              例如数字(5,2)或数字(5,4)

              【讨论】:

                【解决方案10】:

                这可能无法直接解决您的问题,但是当您对一组数字进行四舍五入时,除非您采取特殊预防措施,否则您永远无法保证得到的数字加起来为 100。例如,四舍五入 33.33333、33.33333 和 33.33333 会使总和少一个,因此合乎逻辑的做法是修改集合中最大值的百分比以考虑任何差异。

                这是在 Oracle SQL 中使用分析函数和子查询分解 (WITH) 子句生成示例数据的一种方法。

                with data as (select 25 num from dual union all
                              select 25     from dual union all
                              select 25     from dual)
                select num, 
                case
                   when rnk = 1
                   then 100 - sum(pct) over (order by rnk desc
                                             rows between unbounded preceding
                                                      and         1 preceding)
                   else pct
                end pct
                from
                   (
                   select num,
                          round(100*ratio_to_report(num) over ()) pct,
                          row_number() over (order by num desc) rnk
                   from data
                   )
                /
                
                
                NUM                    PCT                    
                ---------------------- ---------------------- 
                25                     33                    
                25                     33                     
                25                     34                     
                

                【讨论】:

                • 这通常是个坏主意。如果由于四舍五入导致数字不加到 100,那么就是这样。与他们胡闹只会给出不太准确的结果。
                • 这既不是一个好主意也不是一个坏主意,也没有笼统的说法。这只是一种实现特定假设要求的技术。
                • 没错,但这是一个糟糕的要求。这会导致数据显示不正确。它没有回答上面提出的问题。这也不是使百分比相加为 100 的最准确的解决方案,尽管它可能是最简单的。
                【解决方案11】:

                在 ms Access 中可以使用 SQL 函数 ROUND(number, number of decimals),它将数字四舍五入到给定的小数位数:

                ROUND((100 * [TotalVisit1]/[TotalVisit]),1) AS Visit1percent

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-10-06
                  • 1970-01-01
                  • 2020-10-11
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-08-07
                  • 1970-01-01
                  相关资源
                  最近更新 更多