2008-11-25 20 views
7

Hãy nói rằng tôi đã hai bảng hiện có, "chó" và "mèo":SQL có thể tính toán các hàm tổng hợp trên nhiều bảng không?

dog_name | owner 
---------+------ 
Sparky | Bob 
Rover | Bob 
Snoopy | Chuck 
Odie  | Jon 

cat_name | owner 
---------+------ 
Garfield | Jon 
Muffy | Sam 
Stupid | Bob 

Làm thế nào để viết một truy vấn với sản lượng này?

owner | num_dogs | num_cats 
------+----------+--------- 
Bob |  2 | 1 
Chuck |  1 | 0 
Sam |  0 | 1 
Jon |  1 | 1 

Trả lời

10
select owner, sum(num_dogs), sum(num_cats) from 
    (select owner, 1 as num_dogs, 0 as num_cats from dogs 
    union 
    select owner, 0 as num_dogs, 1 as num_cats from cats) 
group by owner 
+0

Slick !! _________ – Haoest

2

Trong T-SQL cho SQL Server 2005 (thay thế CTE với một subquery inline nếu không muốn nói):

WITH ownership AS (
    SELECT owner, COUNT(dog_name) AS num_dogs, 0 AS num_cats -- counts all non-NULL dog_name 
    FROM dogs 
    GROUP BY owner 

    UNION 

    SELECT owner, 0 AS num_dogs, COUNT(cat_name) as num_cats -- counts all non-NULL cat_name 
    FROM cats 
    GROUP BY owner 
) 
SELECT ownership.owner 
    ,SUM(ownership.num_dogs) AS num_dogs 
    ,SUM(ownership.num_cats) as num_cats 
FROM ownership 
GROUP BY ownership.owner 
5

tôi thích cái này:

select owner 
    , count(dog_name) dogs 
    , count(cat_name) cats 
    from cats FULL OUTER JOIN dogs ON (cats.owner = dogs.owner) 
1

tôi bắt đầu với câu trả lời tuyệt vời của Cade Roux, nhưng thay đổi WITH ... AS() để sử dụng một biến bảng, như tôi đã kết thúc bằng cách sử dụng các kết quả từ một truy vấn tương tự cho fu tổng hợp hơn nữa nctions.

-- Table variable declaration 
DECLARE @RainingCatsDogs TABLE 
(
    Owner nvarchar(255), 
    num_cats int, 
    num_dogs int 
) 

-- Populate the table variable with data from the union of the two SELECT statements 
INSERT INTO @RainingCatsDogs 

-- Get the count of doggies 
SELECT 
    owner, COUNT(dog_name) AS num_dogs, 0 AS num_cats 
FROM 
    dogs 
GROUP BY 
    owner 

-- join the results from the two SELECT statements 
UNION 

-- Get the count of kittehs 
SELECT 
    owner, 0 AS num_dogs, COUNT(cat_name) as num_cats 
FROM 
    cats 
GROUP BY 
    owner 

-- From the table variable, you can calculate the summed results 
SELECT 
    owner, 
    SUM(num_dogs), 
    SUM(num_cats) 
FROM 
    @RainingCatsDogs 
Các vấn đề liên quan