2014-10-21 4 views
0

각 사용자에 대해 "전체 서비스 시간"을 합산하려하지만 모든 시도에서 "오류 코드 : 1111. 그룹 기능을 잘못 사용했습니다."가 표시됩니다. 한 가지 시도는 SUM()을 "Total Inservice Hours"필드 주위에 배치 한 다음 u.id로 그룹화하는 것입니다. 여기 SUM 그룹화 된 열

SELECT u.id,"Name", 
atstat.grade,IFNULL(c.total_ceus,0) as max_ceus,c.id as courseid,atsess.id as sessid, count(c.total_ceus) as numsess, IFNULL(ROUND(((SUM(grade)/count(c.total_ceus))*total_ceus)/100,2),0) as "Total Inservice Hours" 
FROM mdl_user u,mdl_course c 
JOIN mdl_course_modules cm ON c.id = cm.course 
JOIN mdl_attendance_sessions atsess ON cm.instance = atsess.attendanceid 
JOIN mdl_attendance_log atlog ON atlog.sessionid = atsess.id 
JOIN mdl_attendance_statuses atstat ON atstat.id = atlog.statusid 
WHERE u.id = atlog.studentid AND (u.id = 3882) AND c.total_ceus > 0 
GROUP by u.id,c.id 
ORDER BY u.id DESC LIMIT 300 

는 해당 쿼리의 결과입니다 : 여기

내 SQL입니다 enter image description here

: 나는 u.id에 의해 GROUP에 시도,하지만 난이 결과를 가지고 enter image description here

내가 정말로 신경 쓰는 유일한 분야는 u.id와 Total Inservice Hours입니다. 나머지는 디버깅을위한 것입니다.

원하는 출력은 총 인 서비스 시간의 합계가되며이 예제에서는 111입니다.

감사합니다.

편집 : 그룹 함수 오류 SQL의 잘못된 사용 :

SELECT u.id,"Name", 
atstat.grade,IFNULL(c.total_ceus,0) as max_ceus,c.id as courseid,atsess.id as sessid, count(c.total_ceus) as numsess, SUM(IFNULL(ROUND(((SUM(grade)/count(c.total_ceus))*total_ceus)/100,2),0)) as "Total Inservice Hours" 
FROM mdl_user u,mdl_course c 
JOIN mdl_course_modules cm ON c.id = cm.course 
JOIN mdl_attendance_sessions atsess ON cm.instance = atsess.attendanceid 
JOIN mdl_attendance_log atlog ON atlog.sessionid = atsess.id 
JOIN mdl_attendance_statuses atstat ON atstat.id = atlog.statusid 
WHERE u.id = atlog.studentid AND (u.id = 3882) AND c.total_ceus > 0 
GROUP by u.id 
ORDER BY u.id DESC LIMIT 300 
+1

오류가 발생하는 쿼리를 표시하십시오. – Barmar

+1

당신은 MySQL이 다른 데이터베이스가 오류를 반환했기 때문에 MySQL이 잘못된 것이라고 잘못 알았 기 때문에 이것은 mysql이라고 말할 수 있습니다. 일반 규칙은 선택 행에 있고 집계가 아닌 경우 group by 절에 있어야합니다. 집계를 사용하여 데이터 필드를 반환하려고하십니까? – Twelfth

+0

@Barmar 오류를 생성 한 SQL을 게시했습니다. – rawrzors

답변

2

당신은 다른 주위에 하나 개의 집계 함수를 래핑 수 없습니다.

원래 쿼리를 하위 쿼리에 넣어서 해당 열 중 하나를 합산해야합니다. ID 및 전체 서비스 시간에만 관심이 있으니 다른 SELECT 열은 사용하지 않아도됩니다.

SELECT id, SUM(`Total Inservice Hours`) AS "Total Inservice Hours" 
FROM (SELECT u.id, IFNULL(ROUND(((SUM(grade)/count(c.total_ceus))*total_ceus)/100,2),0) as "Total Inservice Hours" 
    FROM mdl_user u,mdl_course c 
    JOIN mdl_course_modules cm ON c.id = cm.course 
    JOIN mdl_attendance_sessions atsess ON cm.instance = atsess.attendanceid 
    JOIN mdl_attendance_log atlog ON atlog.sessionid = atsess.id 
    JOIN mdl_attendance_statuses atstat ON atstat.id = atlog.statusid 
    WHERE u.id = atlog.studentid AND (u.id = 3882) AND c.total_ceus > 0 
    GROUP by u.id,c.id 
    ORDER BY u.id DESC LIMIT 300) AS subq 
GROUP BY id 
+0

고마워요! 1 주일 만에 SQL을 사용하지 않는 것과 결합하여 강력한 두통이 생겨서 하위 쿼리를 잊어 버렸습니다. – rawrzors