2012-05-08 4 views
7

Ok vì vậy tôi có một bảng trong đó MỘT trong số các cột có một bản ghi LẠI LẠI TIẾP CẬN.Cần phải chọn TẤT CẢ các cột khi sử dụng COUNT/Nhóm theo số

Nhiệm vụ của tôi là chọn các bản ghi REPEATING với tất cả các thuộc tính.

ID Khách hàng FN LN DOB City State

các DOB có một số giá trị lặp lại mà tôi cần phải chọn từ toàn bộ bảng và liệt kê tất cả các cột của tất cả các hồ sơ mà là cùng trong lĩnh vực DOB ..

My try ...

Select DOB, COUNT(DOB) As 'SameDOB' from Table1 

group by DOB 

HAVING (COUNT(DOB) > 1) 

Điều này chỉ trả về hai cột và một hàng 1 cột là cột DOB xảy ra nhiều lần và cột thứ 2 cho biết số lượng.

Tôi cần tìm ra cách để liệt kê tất cả các thuộc tính không chỉ hai ...

Vui lòng hướng dẫn tôi đi đúng hướng.

+0

bạn chỉ cần liệt kê tất cả trong 'SELECT' và đừng quên đưa vào' GROUP BY'. tui bỏ lỡ điều gì vậy? bạn đã thử nó và nó không cho bạn kết quả bạn mong đợi? –

+0

@PavelVeller - thông thường, có, nhóm theo tác phẩm nhưng khi bạn đang cố gắng tìm hai lần, nhóm bằng cách chống lại tất cả các trường sẽ chỉ tìm số lượng trên các hàng riêng biệt, vì vậy số lượng phải được đặt bên trong truy vấn phụ hoặc CTE. –

Trả lời

13

Tôi nghĩ rằng một giải pháp tổng quát hơn là sử dụng các cửa sổ chức năng:

select * 
from (select *, count(*) over (partition by dob) as NumDOB 
     from table 
    ) t 
where numDOB > 1 

Lý do điều này tổng quát hơn là vì nó dễ thay đổi thành các bản sao trên hai hoặc nhiều cột.

+0

cần đọc lên một nhiều thứ hơn ... phân vùng. Cảm ơn ... học rất nhiều đêm nay. –

9
Select * 
FROM Table1 T 
WHERE T.DOB IN(Select I.DOB 
       FROM  Table1 I 
       GROUP BY I.DOB 
       HAVING COUNT(I.DOB) > 1) 
+1

Sử dụng mệnh đề 'IN' đối với truy vấn phụ có thể khá chậm, chỉ là một FYI. –

+0

Cũng lưu ý rằng bạn đã quên mệnh đề FROM của mình trong truy vấn phụ ... –

+1

@ChrisGessler. Đã sửa lỗi từ nhưng tôi không chắc 'IN' chậm hơn. – gdoron

4

Hãy thử tham gia với một subquery, mà cũng sẽ cho phép bạn xem các tính

select t.*, a.SameDOB from Table1 t 
join (
    Select DOB, COUNT(DOB) As 'SameDOB' from Table1 
    group by DOB 
    HAVING (COUNT(DOB) > 1) 
) a on a.dob = t.dob 
+0

Ahh ... hoạt động. Tôi vẫn là một newb khi nói đến subquery. Tôi đoán tôi cần tập trung vào điều đó thực sự khó khăn trong những ngày sắp tới.Tôi cần phải tìm một cuốn sách bao gồm chi tiết này. –

+0

@JohnSmith - MSDN có thể đọc tốt khi bạn rảnh. –

+0

Bây giờ phần còn lại là, tìm thấy người giữ trẻ tuổi nhất và liệt kê tất cả quyền nuôi con với DOB đó. Nói cách khác, tôi sẽ có ít nhất một bản ghi trong thực thể với tất cả các thuộc tính .... –

-1
select * 
from table1, (select count(*) from table1) as cnt 
+1

Vui lòng cung cấp Mã của bạn với giải thích thích hợp. Mã chỉ câu trả lời không được đánh giá cao. –