需要MYSQL查询的帮助(SUM)

需要MYSQL查询的帮助(SUM),mysql,select,Mysql,Select,我需要您提供一些关于SELECT查询的帮助。我只是想把下表正确地加起来。该表是其他几个表的合成。我可能会为学生的名字添加一个id int值,而不是文本,以使其更容易被删除,但这不是我的问题 我想为每个学生总结三种缺课类型。但是我的sql每次只能得到一个!我做错了什么?我试过几次改变,但都没发现 我想从mysql表中添加一个屏幕,但我没有足够的声誉 SELECT DISTINCT ( P.synthese_abs_schueler_name ) AS synthese_abs_schueler_n

我需要您提供一些关于SELECT查询的帮助。我只是想把下表正确地加起来。该表是其他几个表的合成。我可能会为学生的名字添加一个id int值,而不是文本,以使其更容易被删除,但这不是我的问题

我想为每个学生总结三种缺课类型。但是我的sql每次只能得到一个!我做错了什么?我试过几次改变,但都没发现

我想从mysql表中添加一个屏幕,但我没有足够的声誉

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如果可行,请阅读