2009-07-22 31 views
8

Dưới đây là một truy vấn SQL tôi đã viết để tìm ra tổng số hàng bởi mỗi ID Sản phẩm (proc_id):Đếm SQL (*) và Nhóm Bằng - Tìm Sự khác biệt giữa dòng

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
ORDER BY proc_id; 

Dưới đây là kết quả của truy vấn SQL trên:

 
proc_id count(*) 
01 626 
02 624 
03 626 
04 624 
05 622 
06 624 
07 624 
09 624

Thông báo tổng số lượng bởi proc_id = '01', proc_id = '03', và proc_id = '05' là khác nhau (không bằng 624 hàng như proc_id khác).

Làm cách nào để viết truy vấn SQL để tìm các hàng proc_id nào khác nhau cho proc_id = '01', proc_id = '03' và proc_id = '05' so với proc_id khác?

+0

Nếu tôi hiểu chính xác câu hỏi của bạn, chúng tôi cần thêm thông tin về cấu trúc của phần còn lại của bảng để tạo ra bất kỳ điều gì có ý nghĩa. – Thorarin

Trả lời

2

Nếu bạn biết 624 là con số kỳ diệu:

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> 624 
ORDER BY proc_id; 
14

Trước tiên, bạn cần phải xác định các tiêu chí mà làm '624' chính xác. Có phải trung bình count(*) không? Có phải là count(*) xảy ra thường xuyên nhất không? Đây có phải là yêu thích của bạn count(*)?

Sau đó, bạn có thể sử dụng mệnh đề HAVING để tách những người mà không phù hợp với tiêu chí của bạn:

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> 624 
ORDER BY proc_id; 

hay:

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> (
    <insert here a subquery that produces the magic '624'> 
) 
ORDER BY proc_id; 
+3

+1 vì truy vấn con –

0

thử điều này:

SELECT proc_id, count(*) 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
GROUP BY proc_id 
HAVING count(*) <> (select count(*) from proc z where proc_id in (1) group by proc_id) 
ORDER BY proc_id; 
0

Bạn không thể làm điều này. Đối với một số procIds có ít hàng hơn với ProcId đó. Nói cách khác, các hàng làm cho procId đó không có số đếm = 624 là các hàng KHÔNG tồn tại. Mọi truy vấn có thể hiển thị những hàng như thế nào?

Đối với các đại hội có quá nhiều hàng, IF (và điều này là lớn nếu), NẾU tất cả các hàng trong 624 đối với các procIds khác có một số thuộc tính giống với tập con 624 của tập hợp lớn, sau đó bạn có thể xác định các hàng "thêm", buit không có cách nào để xác định các hàng bị thiếu, tất cả những gì bạn có thể làm là xác định xem các procIds có quá nhiều hàng hay quá ít ...

0

Nếu tôi hiểu câu hỏi của bạn đúng (khác với câu trả lời được đăng khác) bạn muốn các hàng làm cho proc_id 01 khác nhau? Nếu đó là trường hợp, bạn cần phải tham gia vào tất cả các cột nên giống nhau, và tìm sự khác biệt. Vì vậy, để so sánh 01 với 02:

SELECT [01].* 
FROM (
    SELECT * FROM proc 
    WHERE grouping_primary = 'SLB' 
    AND eff_date = '01-JUL-09' 
    AND proc_id = '01' 
) as [01] 
FULL JOIN (
    SELECT * FROM proc 
    WHERE grouping_primary = 'SLB' 
    AND eff_date = '01-JUL-09' 
    AND proc_id = '02' 
) as [02] ON 
    [01].col1 = [02].col1 
    AND [01].col2 = [02].col2 
    AND [01].col3 = [02].col3 
    /* etc...just don't include proc_id */ 
WHERE 
    [01].proc_id IS NULL --no match in [02] 
    OR [02].proc_id IS NULL --no match in [01] 

Tôi chắc rằng MS Sql Server có hàm băm hàng có thể giúp bạn dễ dàng hơn nếu bạn có nhiều cột ... nhưng tôi không thể nghĩ tên của nó.

+0

ngoại trừ điều đó, khi tôi hiểu câu hỏi, nó không phải là giá trị cột làm cho nó khác nhau, nhưng chỉ đơn giản là đếm các hàng với procId đó ... bất kể giá trị cột - –

+0

CHECKSUM là hàm băm hàng ma thuật –

0

Vâng, để tìm thêm bạn sẽ sử dụng cụm từ KHÔNG IN. Để tìm các hàng bị thiếu, bạn cần phải đảo ngược logic. Điều này tự nhiên giả định rằng tất cả 624 hàng đều giống nhau từ proc_id đến proc_id.

SELECT proc_id, varying_column 
FROM proc 
WHERE grouping_primary = 'SLB' 
AND eff_date = '01-JUL-09' 
AND varying_column NOT IN (SELECT b.varying_column 
          FROM proc b 
          WHERE b.grouping_primary = 'SLB' 
          AND b.eff_date = '01-JUL-09' 
          AND b.proc_id = (SELECT FIRST a.proc_id 
               FROM proc a 
               WHERE a.grouping_primary = 'SLB' 
               AND a.eff_date = '01-JUL-09' 
               AND COUNT(a.*) = 624 
               GROUP BY a.proc_id 
               ORDER BY a.proc_id;)) 
ORDER BY proc_id, varying_column; 
Các vấn đề liên quan