2011-07-15 34 views
6

tôi có thể thực hiện các lựa chọn SQL Server sau đây (tên hoặc không lặp lại) khác biệt với một cột trong một bảng như sau:SELECT COUNT (DISTINCT [name]) từ một số bảng

SELECT COUNT(DISTINCT [Name]) FROM [MyTable] 

Nhưng nếu Tôi có nhiều hơn một bảng (tất cả các bảng này chứa trường tên gọi là [Tên]) và tôi cần phải biết số lượng các tên không lặp lại trong hai hoặc nhiều bảng.

Nếu tôi chạy một cái gì đó như thế này:

SELECT COUNT(DISTINCT [Name]) FROM [MyTable1], [MyTable2], [MyTable3] 

tôi nhận được một lỗi, "tên cột nhập nhằng 'Tên'".

PS. Tất cả ba bảng [MyTable1], [MyTable2], [MyTable3] là một sản phẩm của một lựa chọn trước đó.

+0

Bạn có muốn đếm từ tất cả ba bảng? hoặc chỉ từ một trong số họ? – EricZ

+1

Bạn có ý nghĩa gì với "tên không lặp lại"? –

+0

OK, nói, cột [Tên] của MyTable1 có các giá trị: "John", "Mary", "John", "Aaron". Cột [Tên] của MyTable2 có các giá trị: "Mary", "Aaron", "Aaron", "Mary". Cột [Tên] của MyTable3 có các giá trị: "John", "Mary", "John", "John". Tôi cần lấy số đếm, chẳng hạn như: "John" = 5 lần, "Mary" = 4 lần, "Aaron" = 3 lần. – ahmd0

Trả lời

16

Sau khi làm rõ, sử dụng:

SELECT x.name, COUNT(x.[name]) 
    FROM (SELECT [name] 
      FROM [MyTable] 
      UNION ALL 
      SELECT [name] 
      FROM [MyTable2] 
      UNION ALL 
      SELECT [name] 
      FROM [MyTable3]) x 
GROUP BY x.name 

Nếu tôi hiểu đúng, sử dụng:

SELECT x.name, COUNT(DISTINCT x.[name]) 
    FROM (SELECT [name] 
      FROM [MyTable] 
      UNION ALL 
      SELECT [name] 
      FROM [MyTable2] 
      UNION ALL 
      SELECT [name] 
      FROM [MyTable3]) x 
GROUP BY x.name 

UNION sẽ loại bỏ bản sao; UNION ALL sẽ không hoạt động và nhanh hơn.

+0

Tôi nghĩ rằng bạn đã bao gồm tất cả các tùy chọn ngay bây giờ :) +1 –

+0

Và, UNION ALL là đúng cách để đi, bất kể giải pháp nào được sử dụng :) – bobs

+0

Guys, tôi xin lỗi vì đã gây hiểu nhầm cho bạn. Tôi chỉ học SQL. Tôi cũng tò mò, mã này sẽ xử lý tên trong một vấn đề nhạy cảm với chữ, tức là "John" và "john" được tính là 2, hoặc là 1? – ahmd0

5

EDIT: Đã thay đổi sau khi nhìn thấy nhận xét gần đây.

Điều này có cung cấp cho bạn những gì bạn muốn không? Điều này cho phép đếm cho mỗi người sau khi kết hợp các hàng từ tất cả các bảng.

SELECT [NAME], COUNT(*) as TheCount 
FROM 
    (
    SELECT [Name] FROM [MyTable1] 
    UNION ALL 
    SELECT [Name] FROM [MyTable2] 
    UNION ALL 
    SELECT [Name] FROM [MyTable3] 
    ) AS [TheNames] 
GROUP BY [NAME] 
+0

Cảm ơn bạn. Tôi sẽ phải kiểm tra nó là tốt. – ahmd0

1

Dưới đây là một cách khác:

SELECT x.name, SUM(x.cnt) 
FROM (SELECT [name], COUNT(*) AS cnt 
     FROM [MyTable] 
     GROUP BY [name] 
    UNION ALL 
     SELECT [name], COUNT(*) AS cnt 
     FROM [MyTable2] 
     GROUP BY [name] 
    UNION ALL 
     SELECT [name], COUNT(*) AS cnt 
     FROM [MyTable3] 
     GROUP BY [name] 
    ) AS x 
GROUP BY x.name 
Các vấn đề liên quan