3

学部生より大学院生の方が多いグループをリストアップしようとしています。アイデアの背後にあるコンセプトはあると思いますが、クエリを作成するのは単純な翻訳よりも少し難しいです。以下は私のコードです。現在、COUNT(student.career = 'GRD') の右括弧が見つからないというエラーが発生しています。ありがとう。

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;
4

4 に答える 4

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;
于 2013-04-25T04:41:09.267 に答える
0

MySQL を除く SQL Server、PostGresSQL などのほとんどの DBMS でサポートされている WITH As 句を使用しました。

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 の場合、一時テーブルを使用して最初のクエリからの結果セットを保存し、句で UnderGraduate よりも多くの卒業生を持つ GroupNames を除外できますWHERE。この方法は、一時テーブルを作成する構文が異なる他の 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 
于 2013-04-25T06:00:31.757 に答える
0

もう1つのオプション

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)
于 2013-04-25T06:45:19.330 に答える