2013-04-25 3 views
3

학부생보다 졸업 한 그룹을 나열하려고합니다. 내 아이디어 뒤에 개념이 있다고 생각하지만 쿼리를 만드는 것은 단순한 번역보다 조금 어렵습니다. 아래는 내 코드이며, 현재 COUNT (student.career = 'GRD')에서 오른쪽 괄호 오류가 누락되었습니다. 감사.SQL SELECT 문자열 count()보다 큼

SELECT studentgroup.name 
COUNT(student.career = 'GRD') - COUNT(student.career = 'UGRD') 
AS Gradnum FROM studentgroup 
INNER JOIN memberof ON studentgroup.GID = memberof.GroupID 
INNER JOIN student ON memberof.StudentID = student.SID 
WHERE Gradnum > 1; 

답변

1
SELECT studentgroup.GID, max(studentgroup.name) 
FROM studentgroup 
INNER JOIN memberof ON studentgroup.GID = memberof.GroupID 
INNER JOIN student ON memberof.StudentID = student.SID 
GROUP BY studentgroup.GID 
HAVING SUM(CASE WHEN student.career = 'GRD' THEN 1 
       WHEN student.career = 'UGRD'THEN -1 
       ELSE 0 
      END) >0 
+0

끝내 불리는 것 ............. ...... –

+0

잘 했어! 훌륭한 해결책 –

1
SELECT studentgroup.name 
SUM(CASE WHEN student.career = 'GRD' THEN 1 ELSE 0 END) - SUM(CASE WHEN student.career = 'UGRD' THEN 1 ELSE 0 END) 
AS Gradnum FROM studentgroup 
INNER JOIN memberof ON studentgroup.GID = memberof.GroupID 
INNER JOIN student ON memberof.StudentID = student.SID 
WHERE Gradnum > 1 
GROUP BY studentgroup.name; 
+0

이 예상 위치를 찾을 수없는 키워드의 오류를 제공합니다. 이걸 좀 엉망으로하려고하면 내가 그것을 얻을 수 있는지 참조하십시오 –

+0

내 대답을 새로 고침 – realnumber3012

+0

그것은 전화 기능을 것 같다 SUM 후 –

0

내가 MySQL을 위해 당신이 첫 번째 쿼리에서 저장 결과 집합에 임시 테이블을 사용할 수

With grpTbl As 
(

SELECT studentgroup.name As StudentGroupName, 
     SUM(CASE WHEN student.career = 'GRD' THEN 1 ELSE 0 END) AS 'TotalGraduate', 
     SUM(CASE WHEN student.career = 'UGRD' THEN 1 ELSE 0 END) AS 'TotalUnderGraduate' 

FROM studentgroup 
INNER JOIN memberof ON studentgroup.GID = memberof.GroupID 
INNER JOIN student ON memberof.StudentID = student.SID 

) 


SELECT StudentGroupName 
FROM grpTbl 
WHERE TotalGraduate > TotalUnderGraduate 

MySQL을 제외하고 SQL 서버, 포스트그레스 SQL과 같은 DBMS의 대부분을 지원하는 AS 절을 함께 사용했다 WHERE 절에서 UnderGraduate보다 더 많은 졸업생을 가진 GroupNames를 필터링하십시오. 이 방법은 다른 DBMS에서도 작동합니다. 임시 테이블을 만드는 구문이 다릅니다.

CREATE TEMPORARY TABLE grpTbl (
StudentGroupName varchar(255), 
TotalGraduate INT, 
TotalUnderGraduate INT 
); 


INSERT INTO grpTbl 
SELECT studentgroup.name As StudentGroupName, 
      SUM(CASE WHEN student.career = 'GRD' THEN 1 ELSE 0 END) , 
      SUM(CASE WHEN student.career = 'UGRD' THEN 1 ELSE 0 END) 

    FROM studentgroup 
    INNER JOIN memberof ON studentgroup.GID = memberof.GroupID 
    INNER JOIN student ON memberof.StudentID = student.SID 


SELECT StudentGroupName 
    FROM grpTbl 
    WHERE TotalGraduate > TotalUnderGraduate 


DROP TABLE grpTbl 
0

또 하나의 옵션은

SELECT studentgroup.name 
FROM studentgroup INNER JOIN memberof ON studentgroup.GID = memberof.GroupID 
        INNER JOIN student ON memberof.StudentID = student.SID 
GROUP BY studentgroup.name 
HAVING COUNT(CASE WHEN student.career = 'GRD' THEN student.career END) 
     > COUNT(CASE WHEN student.career = 'UGRD' THEN student.career END) 
+0

잘 했어. 이것은 또한 내 문제를 해결하는 또 다른 방법입니다! –