2012-01-06 10 views
0

私は実際の正規化がないデータベースを持っていますので、私は戻って少し良くしていきます。現在、次の列があります。データベースレコードを整理します

FirstName | LastName | SchoolYear | Grade | SchoolId | Games Played 
Bob  | Smith | 2010  | Fr | 245  | 3 
Tina  | Johnson | 2010  | So | 2894  | 10 
Bob  | Smith | 2010  | Fr | 245  | 3 

同じ名前、学年、学年、学校のIDを持つ2人の学校を見つけるにはどうすればよいですか?それらはデータベースに重複しているように見えます(すべての列は同じです)が、各プレイヤーは1つの行しか持たず、毎年ゲームが行われます。これは、学校に似たような人がいることを知る方法です。同じ情報を持つ2行があります。

私は、SQL Server 2008の

感謝を使用しています!

+1

正規化は、データベース内のデータではなく、データベース内の列を複製しないことに関するものです。 – KevinDTimm

答えて

1

私が正しくあなたの質問を理解していれば、このクエリ:これは基本的にあります

SELECT FirstName, LastName, SchoolYear, Grade, SchoolId 
FROM <your table> 
GROUP BY FirstName, LastName, SchoolYear, Grade, SchoolId 
HAVING COUNT(*) > 1 

すべて(のFirstName、LastNameの、SchoolYear、グレード、SchoolId)以上に存在してセット1レコード。

あなたが上記のレコードのSchoolId年代にのみ関心がある場合は、その後、一緒に行く:

SELECT DISTINCT SchoolId 
FROM <your table> 
GROUP BY FirstName, LastName, SchoolYear, Grade, SchoolId 
HAVING COUNT(*) > 1 
0
select count(*), FirstName, LastName, SchoolYear, Grade, SchoolId 
from mytable 
group by FirstName, LastName, SchoolYear, Grade, SchoolId 
order by 1 desc 
+0

HAVING句もあります。たとえば2つ以上のエントリがあるかもしれないことに注意してください。 – Randy

1
select FirstName, LastName, SchoolYear, Grade, SchoolId 
from Student 
group by FirstName, LastName, SchoolYear, Grade, SchoolId 
having count(*) > 1 
1

シンプルGROUP BYHAVING行う必要があります:あなたが使用することをお勧めします

SELECT SchoolId 
FROM YourTable 
GROUP BY FirstName, LastName, SchoolYear, Grade, SchoolId, [Games Played] 
HAVING COUNT(*) = 2 

注意HAVING COUNT(*) > 1生徒が重複しているすべての学校を検索する場合は、

1
SELECT FirstName, 
     LastName, 
     SchoolYear, 
     Grade, 
     SchoolId, 
     (CASE WHEN COUNT(*) > 1 THEN 'Yes' ELSE 'No' END) AS 'Repeat?' 
FROM <table_name> 
GROUP BY FirstName, LastName, SchoolYear, Grade, SchoolId 
+0

ケースのおかげでありがとうございました。 –

関連する問題