Tránh Dùng COUNT(DISTINCT)

Vũ Huy Tâm

Hàm COUNT(DISTINCT) rất hữu ích, tuy nhiên cũng khá tốn kém. Giống như COUNT(), nó lấy tất cả các phần tử, nhưng không dừng lại ở đó nó còn phải sắp xếp và đếm các phần tử không trùng lặp. Trong một số trường hợp bạn có thể tránh dùng hàm này mà vẫn đạt được mục đích. Ví dụ bạn cần tìm tất cả các khách hàng đã từng mua ít nhất hai loại sản phẩm khác nhau, câu lệnh dùng COUNT(DISTINCT) sẽ như thế này:

SELECT KhachHang_ID
FROM dbo.BanHang
GROUP BY KhachHang_ID
HAVING COUNT(DISTINCT SanPham_ID) > 1

Bạn có thể dùng cách khác, hiệu quả hơn, như sau:

SELECT KhachHang_ID
FROM dbo.BanHang
GROUP BY KhachHang_ID
HAVING MIN(SanPham_ID) < MAX(SanPham_ID)

Khi khách hàng mua hai loại sản phẩm khác nhau, SanPham_ID phải khác nhau, do đó MIN(SanPham_ID) phải khác với MAX(SanPham_ID). Và việc tìm ra MIN và MAX của SanPham_ID đơn giản hơn nhiều so với việc phải đếm tất cả các sản phẩm khác nhau.




Tags: , ,

7 Comments
Posted on 14/12/2011 | Categories: SQL Server Programming, Tip & Trick

Các bài viết tương tự

Comments
  • Quang (21/03/2012 9:18 am)

    Bàn có thể nói cho mình sâu thêm về MIN (MASP) và MAX (MASP) không?
    Mình thấy hơi mơ hồ khi dùng câu lệnh đó.
    Cám ơn nhiều

  • 2 (05/12/2012 5:14 am)
    SELECT * FROM MyTable
  • Nguyễn Văn Dương (30/01/2013 5:39 am)

    Anh cho em hỏi kiểu dữ liệu của SamPham_ID trống bản câu truy vấn?
    em thấy khó hiểu câu truy vấn của anh?

    • Phúc (12/06/2015 4:52 am)

      Mình nghĩ là kiểu INT! thông thường ID cũng dùng kiểu INT mà

  • Trung (10/04/2013 1:48 am)

    Theo như mình hiểu thì khi khách hàng mua ít nhất 2 sp trở lên thì khách hàng sẽ có 2 SanPham_ID trong bản bán hàng nên từ đó Min(SanPham_ID) là 1 giá trị khác với giá trị Max(SanPham_ID)

  • Hương (17/02/2017 7:49 pm)

    Cho em hỏi, hàm MAX lấy giá trị lớn nhất. Vậy để biết được giá trị lớn nhất nó phải đếm không ạ

  • Donv (27/04/2017 9:25 pm)

    Rất hay.

Leave a Reply

Hướng dẫn: Để nhập mã T-SQL bạn dùng thẻ <pre lang="tsql"> và </pre>.
Ví dụ: <pre lang="tsql">SELECT * FROM MyTable</pre>