2008-11-25 10 views
7

Digamos que tengo dos tablas existentes, "perros" y "gatos":¿Puede SQL calcular funciones agregadas en múltiples tablas?

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

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

¿Cómo escribir una consulta con esta salida?

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

Respuesta

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

En T-SQL para SQL Server 2005 (sustituir el CTE con una sub consulta en línea si no):

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

prefiero éste:

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

I comencé con la excelente respuesta de Cade Roux, pero cambié el WITH ... AS() para usar una variable de tabla, ya que terminé usando los resultados de una consulta similar para agregar más fu ncciones.

-- 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 
Cuestiones relacionadas