2012-03-11 8 views
0

おはようございます。各グループの最大登録を検索するTransact SQL

私はテーブル構造(Iは、SQL Server 2000を使用しています)

CourseID StudentName TermPaperID

101   Jon   1 
101   Jon   2 
101   Jon   3 
101   David   1 
101   David   2 
102   David   5 
102   David   6 
102   George   5 

を持っている私はCourseID、StudentName、コースごとの最大登録をリストアップしたいと思います。

私は次のクエリ

select 
CourseId, 
StudentName, 
max(x.numberofregistration) as max_registration 
from 
(
    select 
      CourseID, 
      StudentName, 
      count(CourseID) as numberofregistration 
    from 
    dbo.Students 
      group by CourseId,StudentName 
)x 
group by CourseId,StudentName 

を試していないが、それは何も期待した結果が得られませんでした。

期待される結果は

101   Jon   3 
102   David   2 

がどのように予想される結果を達成するために、私はテーブル構造

CourseID StudentNameのmax_registrationを持って のですか?前もって感謝します。

+0

SQL Server 2000?私はあなたに悪いと感じますが、なぜですか? –

+0

別の行がある場合: "102、George、5"これが結果にどのように影響すると思いますか? – ninesided

答えて

1

これは本当に、本当に醜い方法です。私は、あまりにも多くを書き込むよりも、アップグレード料金をポニーにしたいと思う。うまくいけば、誰か他の誰かがきれいなものを思いつきます。

CREATE TABLE #x(CourseID INT, StudentName VARCHAR(32), TermPaperID INT); 

INSERT #x SELECT 101,'Jon ',1; 
INSERT #x SELECT 101,'Jon ',2; 
INSERT #x SELECT 101,'Jon ',3; 
INSERT #x SELECT 101,'David ',1; 
INSERT #x SELECT 101,'David ',2; 
INSERT #x SELECT 102,'David ',5; 
INSERT #x SELECT 102,'David ',6; 
INSERT #x SELECT 102,'George',5; 

SELECT b.CourseID, b.StudentName, max_registration = COUNT(*) 
FROM #x AS b 
INNER JOIN (
    SELECT CourseID, c = MAX(c) 
    FROM 
    (
    SELECT CourseID, StudentName, c = COUNT(CourseID) 
    FROM #x GROUP BY CourseID, StudentName 
) AS x GROUP BY CourseID 
) AS s 
ON b.CourseID = s.CourseID 
GROUP BY b.CourseID, b.StudentName 
HAVING COUNT(*) = MAX(s.c) 
ORDER BY b.CourseID; 
+0

私を案内する時間を費やしてくれてありがとう。私はrow_number()とPartitionを使って簡単にこれを解決することができますが、SQL Server 2000を使用しているクライアントサイドプロジェクトで作業しています。 – user1256813

0

あなたのCTE「x」は、カウントしている値と同じ値でグループ化されているようです。単純に異なるフィールド(すなわち、用語用紙ID)を数えれば、期待される結果が得られるはずです。

あなたの希望する結果のサンプルでは、​​その結果がサンプルデータから期待される理由がわかりません。私がこの質問を誤解してしまったら、もう一度お試しください! :-)

関連する問題