需要MYSQL查询的帮助(SUM)
我需要您提供一些关于SELECT查询的帮助。我只是想把下表正确地加起来。该表是其他几个表的合成。我可能会为学生的名字添加一个id int值,而不是文本,以使其更容易被删除,但这不是我的问题 我想为每个学生总结三种缺课类型。但是我的sql每次只能得到一个!我做错了什么?我试过几次改变,但都没发现 我想从mysql表中添加一个屏幕,但我没有足够的声誉需要MYSQL查询的帮助(SUM),mysql,select,Mysql,Select,我需要您提供一些关于SELECT查询的帮助。我只是想把下表正确地加起来。该表是其他几个表的合成。我可能会为学生的名字添加一个id int值,而不是文本,以使其更容易被删除,但这不是我的问题 我想为每个学生总结三种缺课类型。但是我的sql每次只能得到一个!我做错了什么?我试过几次改变,但都没发现 我想从mysql表中添加一个屏幕,但我没有足够的声誉 SELECT DISTINCT ( P.synthese_abs_schueler_name ) AS synthese_abs_schueler_n
SELECT DISTINCT ( P.synthese_abs_schueler_name ) AS synthese_abs_schueler_name,
SUM(A.synthese_sum) AS absent,
SUM(B.synthese_sum) AS nonexcused,
SUM(C.synthese_sum) AS tardive,
SUM(absent + nonexcused) AS totalabs,
FROM synthese_abs AS P
LEFT JOIN (SELECT synthese_abs_schueler_name,
synthese_abs_type,
synthese_abs_sum AS synthese_sum
FROM synthese_abs
WHERE synthese_abs_type = 1
AND synthese_abs_sum > 0
GROUP BY synthese_abs_schueler_name) AS A
ON A.synthese_abs_type = P.synthese_abs_type
AND A.synthese_abs_schueler_name = P.synthese_abs_schueler_name
LEFT JOIN (SELECT synthese_abs_schueler_name,
synthese_abs_type,
synthese_abs_sum AS synthese_sum
FROM synthese_abs
WHERE synthese_abs_type = 2
AND synthese_abs_sum > 0
GROUP BY synthese_abs_schueler_name) AS B
ON B.synthese_abs_type = P.synthese_abs_type
AND B.synthese_abs_schueler_name = P.synthese_abs_schueler_name
LEFT JOIN (SELECT synthese_abs_schueler_name,
synthese_abs_type,
synthese_abs_sum AS synthese_sum
FROM synthese_abs
WHERE synthese_abs_type = 3
AND synthese_abs_sum > 0
GROUP BY synthese_abs_schueler_name) AS C
ON C.synthese_abs_type = P.synthese_abs_type
AND C.synthese_abs_schueler_name = P.synthese_abs_schueler_name
ORDER BY P.synthese_abs_schueler_name
在三个子查询中删除GROUPBY子句并将其添加到主查询中如何:
SELECT P.synthese_abs_schueler_name,
SUM(A.synthese_sum) AS absent,
SUM(B.synthese_sum) AS nonexcused,
SUM(C.synthese_sum) AS tardive,
SUM(absent + nonexcused) AS totalabs,
FROM synthese_abs AS P
LEFT JOIN (SELECT synthese_abs_schueler_name,
synthese_abs_type,
synthese_abs_sum AS synthese_sum
FROM synthese_abs
WHERE synthese_abs_type = 1
AND synthese_abs_sum > 0) AS A
ON A.synthese_abs_schueler_name = P.synthese_abs_schueler_name
LEFT JOIN (SELECT synthese_abs_schueler_name,
synthese_abs_type,
synthese_abs_sum AS synthese_sum
FROM synthese_abs
WHERE synthese_abs_type = 2
AND synthese_abs_sum > 0 ) AS B
ON B.synthese_abs_schueler_name = P.synthese_abs_schueler_name
LEFT JOIN (SELECT synthese_abs_schueler_name,
synthese_abs_type,
synthese_abs_sum AS synthese_sum
FROM synthese_abs
WHERE synthese_abs_type = 3
AND synthese_abs_sum > 0) AS C
ON C.synthese_abs_schueler_name = P.synthese_abs_schueler_name
GROUP BY P.synthese_abs_schueler_name
试试这个:
SELECT P.synthese_abs_schueler_name AS synthese_abs_schueler_name,
SUM(A.synthese_abs_sum) AS absent,
SUM(B.synthese_abs_sum) AS nonexcused,
SUM(C.synthese_abs_sum) AS tardive,
SUM(A.synthese_abs_sum)+SUM(B.synthese_abs_sum) AS totalabs
FROM
synthese_abs AS P
LEFT JOIN synthese_abs A ON A.synthese_abs_type = 1 AND A.synthese_abs_sum >0 AND A.synthese_abs_schueler_name = P.synthese_abs_schueler_name
LEFT JOIN synthese_abs B ON B.synthese_abs_type = 2 AND B.synthese_abs_sum >0 AND B.synthese_abs_schueler_name = P.synthese_abs_schueler_name
LEFT JOIN synthese_abs C ON C.synthese_abs_type = 3 AND C.synthese_abs_sum >0 AND C.synthese_abs_schueler_name = P.synthese_abs_schueler_name
GROUP BY P.synthese_abs_schueler_name
基本上,按Schüler的名字分组以获得每个Schüler的总和是很重要的。您可以按如下方式重写查询,而不是使用许多自联接,您可以在
sum()中使用CASE
基于synthese_abs_type
的值求和synthese_sum
,对于缺席和未超出的总和,我使用了subselect,因为在相同的查询级别上,您可以在select中使用聚合结果的别名,或者使用sub-select,或者重复整个表达式
SELECT *, absent + nonexcused AS totalabs
FROM (
SELECT synthese_abs_schueler_name ,
SUM(CASE WHEN synthese_abs_type = 1 THEN synthese_sum ELSE 0 END) AS absent,
SUM(CASE WHEN synthese_abs_type = 2 THEN synthese_sum ELSE 0 END) AS nonexcused,
SUM(CASE WHEN synthese_abs_type = 3 THEN synthese_sum ELSE 0 END) AS tardive
FROM
synthese_abs
WHERE synthese_abs_sum >0
GROUP BY synthese_abs_schueler_name
ORDER BY synthese_abs_schueler_name
) t
这是一个很好的暗示。即使这样,我也没有把所有的学生分开。它是否可能只显示每三个类别中有一个条目的学生?如果没有条目,LEFT JOIN应该给我空值,而不是完全忽略它?@Ameliore,我编辑了我的答案。这能给你你想要的吗?那是一个不能执行的错误。我发现我必须在代码的最后一行分组。。我将尝试几件事情来了解它的准确性。编辑了SQL,请看一看。就是这样!!!!多谢各位。很好-你的查询比我的查询要干净得多。看到这个干净的解决方案,我必须在sql查询上做一些工作。@Ameliore如果可行,请阅读