2014-07-07 13 views
2

에 대한 도움말이 필요합니다. SELECT QUERY로 도움을 받으십시오. 나는 다음 표를 정확하게 합산하기를 원했습니다. 테이블은 여러 다른 테이블의 합성어입니다. 아마도 goup을 쉽게하기 위해 텍스트 대신 학생 이름에 id int 값을 추가 할 것입니다. 그러나 이것은 제 문제가 아닙니다.MYSQL QUERY (SUM)

나는 각 학생에 대해 결석 수업의 3 가지 유형을 합산하고자합니다. 하지만 내 SQL과 나는 매번 단 하나있어! 내가 도대체 ​​뭘 잘못하고있는 겁니까? 나는 몇 가지 변화를 시도했지만 ..

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 

답변

1

, 당신은 synthese_abs_type의 값과 결석의 웅대 한 합계를 기반으로 synthese_sum 합계를 SUM()CASE을 사용하고 난 때문에 같은에서 부속을 사용하고 nonexcused 수 있습니다 쿼리의 수준을 사용하면 집계 결과의 별칭을 사용할 수 있습니다. 하위 선택 사용 또는 전체 표현 반복 사용

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 
+1

이것은 그 것이다 !!!! 정말 고마워. 좋아요. 쿼리가 내 것보다 훨씬 깔끔합니다. 나는이 깨끗한 해결책을보고 내 SQL 쿼리에 대한 몇 가지 작업을해야합니다. – Ameliore

+0

@Ameliore 작동하는 경우 [* 수락 대답 : 어떻게 작동합니까? *] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235) –

0

을 나는

내가 내 MySQL의 테이블에서 화면을 추가하고 싶었 .. 그것을 찾지 못했습니다하지만 난 충분히 명성을하지 않아도 어떻게 그룹을 제거하는 방법에 대한 당신이 가지고있는 세 개의 하위 쿼리에서 절 메인 쿼리에 추가하여 :

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 
+0

이것은 좋은 힌트였습니다. 이것으로도 나는 모든 학생들을 분리시키지 않았다. 세 범주에 모두 들어있는 학생 만 보여줄 수 있습니까? LEFT JOIN은 엔트리가없고 완전히 무시하지 않으면 NULL을 제공해야합니까? – Ameliore

+0

** @ Ameliore **, 나는 나의 대답을 편집했다. 그게 당신이 찾고있는 것을 줄 수 있습니까? – Linger

0

이 시도 :

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의 이름이 GROUP BY 인 이유는 /Schüler입니다.

당신은 많은 자기 조인을 사용하는 대신 다음과 같이 쿼리를 다시 작성할 수 있습니다
+0

그 중 하나를 실행할 수 없습니다 - 오류. 나는 코드의 마지막 줄에 그룹화해야한다는 것을 알았다. .. 얼마나 위풍 당당한 지 알아 내기 위해 여러 가지 시도를해볼 것입니다. – Ameliore

+0

SQL을 편집했습니다.보세요. – JimmyB