次の 3 つのテーブルがあります。
学生に関する表:
s41071030(sno, sname, ssex, sage, sdept)
コースに関する表:
c41071030(cno, cname, cpno, credit)
コースの選択に関する表:
sc41071030(sno, cno, grade)
sdept='CS'
ここで、学科で最も多くのコースを選択した学生の詳細を選択したいと思います'CS'
。
次の 3 つのテーブルがあります。
学生に関する表:s41071030(sno, sname, ssex, sage, sdept)
コースに関する表:c41071030(cno, cname, cpno, credit)
コースの選択に関する表:sc41071030(sno, cno, grade)
sdept='CS'
ここで、学科で最も多くのコースを選択した学生の詳細を選択したいと思います'CS'
。
行を集計sc41071030
してカウントを取得します。
結果を次のように結合しますs41071030
。
で行をフィルタリングしsdept
ます。
学生の詳細を取得します。
RANK()
カウント値で結合された行。
ランキングが 1 の行を選択します。
WITH
aggregated AS (
SELECT
sno,
COUNT(*) AS coursecount
FROM
sc41071030
GROUP BY
sno
),
ranked AS (
SELECT
s.*,
RANK() OVER (ORDER BY agg.coursecount DESC) AS rnk
FROM
s41071030 s
INNER JOIN aggregated agg ON s.sno = agg.sno
WHERE
s.sdept = 'CS'
)
SELECT
sno,
sname,
ssex,
sage,
sdept
FROM
ranked
WHERE
rnk = 1
;
多少複雑な SQL ステートメントと同様に、'TDQD' (テスト駆動クエリ設計) を実行するのが最善です。質問の単純な部分から始めて、それらをより複雑な回答にします。
CS 部門の各学生が受講しているコースの数を調べるには、次のように記述します。
SELECT S.Sno, COUNT(*) NumCourses
FROM s41071030 S
JOIN sc41071030 SC ON S.Sno = SC.Sno
WHERE S.Sdept = 'CS'
GROUP BY S.Sno;
NumCourses の最大値を見つける必要があります。
SELECT MAX(NumCourses) MaxCourses
FROM (SELECT S.Sno, COUNT(*) NumCourses
FROM s41071030 S
JOIN sc41071030 SC ON S.Sno = SC.Sno
WHERE S.Sdept = 'CS'
GROUP BY S.Sno
)
次に、その結果をサブクエリと結合する必要があるため、CTE (Common Table Expression) を実行します。
WITH N AS
(SELECT S.Sno, COUNT(*) NumCourses
FROM s41071030 S
JOIN sc41071030 SC ON S.Sno = SC.Sno
WHERE S.Sdept = 'CS'
GROUP BY S.Sno
)
SELECT N.Sno
FROM N
JOIN (SELECT MAX(NumCourses) MaxCourses FROM N) M
ON M.MaxCourses = N.NumCourses;
そして、学生の詳細を取得する必要があるため、それを学生テーブルと結合します。
WITH N AS
(SELECT S.Sno, COUNT(*) NumCourses
FROM s41071030 S
JOIN sc41071030 SC ON S.Sno = SC.Sno
WHERE S.Sdept = 'CS'
GROUP BY S.Sno
)
SELECT S.*
FROM s41071030 S
JOIN N ON N.Sno = S.Sno
JOIN (SELECT MAX(NumCourses) MaxCourses FROM N) M
ON M.MaxCourses = N.NumCourses;
軽くテストされた SQL: 警告されました。テストするには、コンポーネント クエリを実行し、毎回適切な結果が得られることを確認します。前のクエリが正しく機能するまで、次のクエリに進まないでください。
course テーブルは、解決しようとしているクエリにとって重要ではないことに注意してください。
また、同じ数のコースを受講している複数の学生がいて、その数が受講している学生の最大数であることが判明した場合、これは複数の行を返す可能性があることに注意してください。(したがって、それぞれ 7 つのコースを受講している 3 人の学生がいて、7 つを超えるコースを受講している学生がいない場合、結果セットには 3 つの行が表示されます。)