【问题标题】:mysql calculate percentage between two sub queriesmysql计算两个子查询之间的百分比
【发布时间】:2014-04-29 16:52:18
【问题描述】:

我正在尝试计算符合特定标准的学生的百分比。 我有 3 个单独的表需要从中获取数据,然后我需要从一个表(学生)中获取总数作为学生总数。 然后我需要用这个总数来除第二次查询中学生人数的 COUNT。

所以基本上我想首先计算数据库中所有学生的数量。 然后计算出现在我的主查询中的学生人数(返回数据的学生)。 然后我需要执行计算,将 noOfStudents (2) 除以主要总数 (24)(DB 中的学生人数),然后 *100 给出符合主要查询条件的学生百分比.

这是我目前所拥有的:

SELECT * FROM (
(
SELECT s.firstname, s.lastname, s.RegistrationDate, s.Email, d.ReviewDate,(r.description) AS "Viva"  , COUNT(*) AS "No of Students"
FROM student s
INNER JOIN dates d 
ON s.id=d.student_identifier 
INNER JOIN reviews r
ON d.review_Identifier=r.id 
WHERE r.description = "Viva Date"
GROUP BY s.student_identifier
ORDER BY s.student_identifier)
) AS Completed
WHERE Completed.ReviewDate BETWEEN '2012-01-01' AND '2014-12-01'
;

我需要在第二个 SELECT 之后输出字段,然后这些数据将通过 PHP/HTML 代码显示在页面上(BETWEEN 日期将通过“%s”发送)。

我想知道我是否应该使用 2 个单独的查询,然后从第一个查询中获取值 (24) 以在第二个查询中执行计算,但我无法弄清楚如何保存为 2 个单独的查询然后引用第一个查询。

我也不确定是否可以在输出满足条件的单个行的同时显示总百分比?

我正在尝试自学 SQL,因此,如果我在上述任何内容中犯了任何明显的错误/假设,我深表歉意,并且不胜感激。

谢谢。

【问题讨论】:

标签: php mysql sql


【解决方案1】:

你能做到吗?

SELECT COUNT(*) as TotalPopulation, 
COUNT(d.student_identifier='student') as TotalStudents, 
COUNT(d.student_identifier='student')/ count(*) *100 as Percentage of students  
from students s 
inner join dates d
on s.id = d.student_identifier
inner join reviews r
on r.id = d.review_Identifier
WHERE d.ReviewDate BETWEEN '2012-01-01' AND '2014-12-01' and r.description = 'Viva Date';

如果您只是在寻找计数,则不一定需要名字姓氏。 这是表的计数(*),然后是您在第二个计数()中用于识别学生的任何标志,您之前只是将它分组,考虑到您在聚合之前的选择中还有很多其他内容,这可能会给您错误的结果。

你也可以试试:

SELECT d.student_identifier, s.firstname, s.lastname, 
s.RegistrationDate, s.Email, d.ReviewDate,(r.description) AS "Viva" 
FROM student s
INNER JOIN dates d 
ON s.id=d.student_identifier 
INNER JOIN reviews r
ON d.review_Identifier=r.id 
WHERE r.description = "Viva Date" and d.ReviewDate BETWEEN '2012-01-01' AND '2014-12-01'
ORDER BY s.student_identifier

现在,如果你想返回一个列表,那就是第二个,如果你想返回一个计数,你可以使用第一个查询并调整你的 student_identifier。

【讨论】:

  • 谢谢,但我需要在结果中输出这些字段,因为我需要显示学生列表。这是我的观点,即我试图做的事情是否真的可行 - 即显示所有相关学生,其 Viva 日期在迄今为止的输入之间,然后计算总学生的百分比。
  • 我已经在上面尝试过你的代码,但这只是给了我一行 Total Population TotalStudents Percentage of Students 2 2 100.0000
  • 您可能无法做到这一点。如果在计数聚合为您提供结果列表但它们不正确之前不按所有内容分组会发生什么。如果你想这样做,你应该这样做:名字、姓氏、电子邮件、student_identifier、注册日期、审查日期作为表格或临时表格,然后再将其汇总。你不想两者都做,因为结果会相差太大。
  • 唯一的其他选择是在第一个查询上使用GROUP_CONCAT,例如 GROUP_CONCAT(concat(firstname,',', lastname),'-') ,这将返回与该查询相关的所有名称数。
  • 谢谢@Hituptony。我在我编写的其他查询中使用了 GROUP_CONCAT 和 CONCAT,但是因为我将记录集带回 PHP 以在页面上输出,所以我不确定我是否能够从返回的数组中获取每个元素。可能执行 2 个单独的查询,返回 2 个整数值,然后在 PHP 端执行 % 计算是否被认为是不好的做法?
猜你喜欢
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 2014-04-06
  • 1970-01-01
  • 2012-05-01
  • 2011-08-13
相关资源
最近更新 更多