【问题标题】:SQL Divide by Two Count()SQL 除以两个 Count()
【发布时间】:2009-07-14 19:47:03
【问题描述】:

我有以下查询,它试图找出某个产品占产品总数的百分比。 IE:[产品数量] / [总产品] = 百分比

;WITH totalCount AS(
    SELECT 
        CAST(COUNT(id) as Integer)as totalCount
    FROM TABLE_NAME
)
SELECT 
    ((CAST(COUNT(DISTINCT id) as Integer)/(SELECT * FROM totalCount))*100) as 'Percent'
FROM TABLE_NAME

但是,除非只有一条记录,否则百分比列始终返回“0”。另外,有没有办法把totalCount和Select查询合二为一?

基本上,如何划分两个 Count() 字段?

【问题讨论】:

    标签: sql sql-server count


    【解决方案1】:

    将您的总数转换为整数以外的数字(DECIMAL?) - 数学四舍五入。

    【讨论】:

    • 谢谢,成功了!简单的事情总是能吸引你。
    • 确保您注释了该代码。下一个开发者可能不像你那么聪明。
    • 我通常使用更简单的技巧,而不是乘以 100 乘以 100.0
    【解决方案2】:

    转换为具有小数精度的东西,而不是整数。浮点数或实数。

    select cast(distinctCount as real)/cast(totalCount as real) * 100.00
       , distinctCount
       , totalCount
    from (
     select count(distinct id) as distinctCount
      , count(id) as totalCount
      from Table) as aggregatedTable
    

    【讨论】:

    • 使用小数 切勿在数学计算中使用浮点数或实数,因为它们是不精确的数据类型,可能会引入舍入错误。
    【解决方案3】:

    不应该是这样的:

    ;WITH totalCount AS(
        SELECT 
            CAST(COUNT(id) as Integer)as totalCount
        FROM TABLE_NAME
    )
    SELECT 
        ((CAST(COUNT(DISTINCT id) as Integer)*100/(SELECT count(*) FROM totalCount))) as 'Percent'
    FROM TABLE_NAME
    

    注意 SELECT COUNT(*)。另外,除法之前应该先乘,否则总是为零

    【讨论】:

    • 我不这么认为,因为 totalCount 查询只返回一行,所以如果添加 COUNT(*) 它将始终返回 1,而不是实际总数。不过感谢您的帮助:)
    • 好吧 :-) 但是乘以 100 肯定会解决你的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多