2017-10-16 15 views
0

一意のStudentVisitIdの書籍IDおよび/またはブックコードが重複しているかどうかをチェックしなければならず、一行を返す必要があります。SQL:ライブラリデータベースの重複エントリの検索

BookID StudentVisitId BookCode ListOrder 
42568 4531   B1162  3 
42568 4531   B1162  2 
64532 4531   B1178  2 
64532 4598   B1178  3 
76543 4622   B1178  2 
64532 4622   B1178  1 

予想される出力:

StudentVisitId DuplicateEntry 
4531   0 
4598   1 
4622   1 

0StudentVisitId4531BookIdの重複であることを示し、重複が見つかった場合、それは他の0 1

データを返す必要があります42568およびBookCodeB1162

答えて

1

あなたはこの

SELECT StudentVisitId, MIN(DuplicateEntry) DuplicateEntry 
FROM (
    SELECT BookID, StudentVisitId, BookCode, DuplicateEntry = (CASE WHEN COUNT(*) > 1 THEN 0 ELSE 1 END) 
    FROM @DATA 
    GROUP BY BookID, StudentVisitId, BookCode 
) AS A 
GROUP BY StudentVisitId 
1

これは多くの方法で実行できます。 SQLは、私が正しく理解していればCTE

; 
WITH CTE(StudentVisitId, DuplicateEntry) 
AS 
(
SELECT StudentVisitId, 
     CASE 
     WHEN ROW_NUMBER() OVER (PARTITION BY BookId, StudentVisitId, BookCode ORDER BY StudentVisitId) > 1 
     THEN 0 ELSE 1 
     END 
FROM LibraryData 
)SELECT StudentVisitId, MIN(DuplicateEntry) FROM cte 
GROUP BY StudentVisitId 
1

を使ってこれを実現する方法を示しています下:

select studentid, 
     (case when min(bookcode) = max(bookcode) then 1 else 0 end) as isDuplicate 
from t 
group by studentid; 

を私はisDuplicateは本当にこの場合には何を意味するのか正確にはわかりません。それは列の奇妙な名前のようです。より良い名前はhasOnlyOneBookです。

+0

Caseステートメントは反対の答えを与えて試すことができます。しかし、値1と0を交換したところ、うまくいきました。 – Madhukar

関連する問題