【问题标题】:Dividing two results of count with eachother in SQL在SQL中将两个count的结果相除
【发布时间】:2019-09-27 08:40:12
【问题描述】:

我有两个想要划分的 COUNT() 结果,但是当我尝试将其组合成一个查询时它不起作用。当我尝试运行此代码时,出现“在“SELECT”处或附近出现语法错误:

SELECT COUNT(student.userid) FROM borrowed CROSS JOIN student WHERE student.userid = borrowed.userid AND current_date > expiredate AND returndate IS NULL / SELECT COUNT(userid) FROM student;

该代码应该能够获取当前延迟归还图书的“学生”的百分比。由“/”分隔的两个代码 sn-ps 都可以单独工作。左边:

SELECT COUNT(student.userid) FROM borrowed CROSS JOIN student WHERE student.userid = borrowed.userid AND current_date > expiredate AND returndate IS NULL;

生成一个包含值 2 的计数表。右侧:

SELECT COUNT(userid) FROM student;

生成一个包含值 15 的计数表。

我想要得到的是百分比。所以 2/15 应该给我 13,3 % 之类的东西。如何将其作为单个查询解决?除法必须以某种方式浮动(或其他小数)。有人可以为我提供解决此问题的查询吗?谢谢

【问题讨论】:

  • SELECT COUNT(*) / (SELECT COUNT(*) FROM... ) FROM ...

标签: sql database postgresql database-design


【解决方案1】:

您可以尝试以下查询:

SELECT COUNT(student.userid)::decimal / (SELECT COUNT(userid) FROM student) 
FROM borrowed 
CROSS JOIN student 
WHERE student.userid = borrowed.userid 
     AND current_date > expiredate AND returndate IS NULL;

【讨论】:

  • @KTHKarl。 . .这不符合您的要求。它计算的是迟到的书而不是学生的数量。此外,它比必要的复杂得多。
【解决方案2】:

我会推荐以下内容:

SELECT COUNT(DISTINCT b.student_id) / s.num_students
FROM borrowed b CROSS JOIN
     (SELECT COUNT(*) as num_students FROM student) s
WHERE b.current_date > expiredate AND b.returndate IS NULL;

具体而言,这会计算学生的数量,而不是迟到的书籍。因此,有两本书迟到的学生只计算一次,而不是两次。

【讨论】:

    猜你喜欢
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    • 2016-05-07
    相关资源
    最近更新 更多