Xử Lý Dữ Liệu Trong SQL Server: Phát Hiện Giá Trị Lặp Lại Giữa Các Cột

Trong các ứng dụng thực tế, việc phát hiện các bản ghi lặp trong các cột là một yêu cầu phổ biến. Tuy nhiên, trong nhiều trường hợp, cần kiểm tra sự trùng lặp giữa các cột trong cùng một nhóm dữ liệu. Ví dụ, với một bảng chứa dữ liệu câu hỏi trắc nghiệm, chúng ta cần đảm bảo rằng các tùy chọn (A, B, C, D) không có giá trị trùng nhau trong cùng một câu hỏi.

Môi Trường Thực Thi

  • Hệ điều hành: Windows Server 2019 Standard
  • Cơ sở dữ liệu: Microsoft SQL Server 2019
  • .NET Framework: 4.8

Mẫu Thiết Kế Dữ Liệu

Bảng dethi được thiết kế như sau:

IDTên TrườngLoạiMô tả
1cauhoi_idintSố thứ tự câu hỏi, duy nhất
2loai_cauhoinvarcharLoại câu hỏi (đơn hoặc đa lựa chọn)
3noi_dungnvarcharNội dung câu hỏi
4AnvarcharLựa chọn A
5BnvarcharLựa chọn B
6CnvarcharLựa chọn C
7DnvarcharLựa chọn D

Thực Hiện Chức Năng

SQL Statement

Đầu tiên, sử dụng lệnh UNION ALL để ghép nối các cột A đến D thành một tập dữ liệu duy nhất:

SELECT opt AS gia_tri, cauhoi_id FROM dethi WHERE opt = 'A'
UNION ALL
SELECT opt AS gia_tri, cauhoi_id FROM dethi WHERE opt = 'B'
UNION ALL
SELECT opt AS gia_tri, cauhoi_id FROM dethi WHERE opt = 'C'
UNION ALL
SELECT opt AS gia_tri, cauhoi_id FROM dethi WHERE opt = 'D';

Sau đó, dùng câu lệnh GROUP BY và hàm tổng hợp COUNT() để đếm số lần xuất hiện của mỗi giá trị:

SELECT gia_tri, COUNT(gia_tri) so_lan, cauhoi_id 
FROM (
    SELECT A AS gia_tri, cauhoi_id FROM dethi
    UNION ALL
    SELECT B AS gia_tri, cauhoi_id FROM dethi
    UNION ALL
    SELECT C AS gia_tri, cauhoi_id FROM dethi
    UNION ALL
    SELECT D AS gia_tri, cauhoi_id FROM dethi
) tmp GROUP BY cauhoi_id, gia_tri ORDER BY cauhoi_id;

Cuối cùng, áp dụng mệnh đề HAVING để lọc ra các bản ghi có giá trị bị lặp lại:

SELECT gia_tri, COUNT(gia_tri) so_lan, cauhoi_id 
FROM (
    SELECT A AS gia_tri, cauhoi_id FROM dethi
    UNION ALL
    SELECT B AS gia_tri, cauhoi_id FROM dethi
    UNION ALL
    SELECT C AS gia_tri, cauhoi_id FROM dethi
    UNION ALL
    SELECT D AS gia_tri, cauhoi_id FROM dethi
) tmp GROUP BY cauhoi_id, gia_tri HAVING COUNT(gia_tri) > 1 ORDER BY cauhoi_id;

Với kết quả này, bạn có thể dễ dàng xác định những câu hỏi nào có các tùy chọn bị trùng lặp và tiến hành sửa chữa.

Thẻ: SQL-Server Data-Analytics database-management

Đăng vào ngày 29 tháng 6 lúc 16:56