2008-11-25 65 views
7

比方说,我有两个现有的表,“狗”和“猫”:SQL可以计算多个表中的聚合函数吗?

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

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

我怎样写这个输出查询?

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

回答

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

光滑!! _________ – Haoest 2010-09-10 19:08:37

2

在T-SQL为SQL Server 2005(内置子查询,如果不更换CTE):

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

我喜欢这一个:

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

我从Cade Roux的出色答案开始,但将WITH ... AS()更改为使用表变量,因为我最终使用类似查询的结果来进一步聚合fu 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