【问题标题】:Division of two statements with count returns zero两个带有计数的语句的除法返回零
【发布时间】:2017-06-22 22:55:42
【问题描述】:

我是 SQL 新手(使用 SQLiteStudio)并且正在尝试使用一些聚合函数。我想找到我的数据子集的比例,其中个体质量小于 575,但查询一直返回零:

SELECT A/B*100
FROM (
    SELECT COUNT(*) AS A
    FROM Male
    WHERE mass < 575 AND location = 'Hawaii')
        ,(
    SELECT COUNT(*) AS B
    FROM Male
    WHERE location = 'Hawaii')
;

我已阅读其他问题,其中问题是必须将相关变量声明为小数,但我不知道如何更改 COUNT() 函数的约束。乘以 A*B 就可以了。

【问题讨论】:

    标签: sql sqlite count division


    【解决方案1】:

    您可以将查询简化为一个选择语句,并通过乘以 100.0 来强制转换,其中 .0 应该可以解决问题

    SELECT
      (SUM(CASE WHEN mass < 575 THEN 1 ELSE 0 END) * 100.0) / COUNT(*)
    FROM Male
    WHERE location = 'Hawaii'
    

    【讨论】:

    • 这确实简化了查询,但它返回 100?
    • 您能否将 A 和 B 的结果作为单独的语句更新您的答案?他们持有什么价值观?
    • A 是 10,B 是 34。所以正确的回报应该是 29。
    • 我使用了错误的聚合函数。对于有质量的 CASE 语句,它应该是 SUM。查看更新的答案。如果需要,您可以对输出进行四舍五入或将其转换为 int 数据类型以去除小数部分。
    【解决方案2】:

    试试

    SELECT A * 100 / B
    

    否则中间结果会因为整数除法为0。

    【讨论】:

    • 这很简单!现在我想对所有位置都这样做,但我不知道如何解决“不明确的列名”错误:'SELECT location, A*100/B FROM (SELECT , COUNT() 作为男性 M1 的 A,其中质量 , COUNT() AS B 从男性 M2 GROUP BY m2.location) WHERE M1.location = M2.location GROUP BY M1.location ;'返回:不明确的列名:位置
    • 选择 M1.location
    • 不幸的是,没有。它仍然返回“歧义列”错误,但我更改了查询以合并 CASE WHEN 语句(来自上面的评论者)和 GROUPED BY 位置,并返回了我正在寻找的内容。
    猜你喜欢
    • 2018-10-26
    • 2018-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-09
    • 2014-03-10
    • 2016-03-21
    相关资源
    最近更新 更多