Допустим, у меня есть две таблицы, «собаки» и «кошки»:
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


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
В 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
Я предпочитаю этот:
select owner
, count(dog_name) dogs
, count(cat_name) cats
from cats FULL OUTER JOIN dogs ON (cats.owner = dogs.owner)
Я начал с отличного ответа Cade Roux, но изменил WITH ... AS (), чтобы использовать табличную переменную, поскольку в итоге я использовал результаты аналогичного запроса для дальнейших агрегатных функций.
-- 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
Если ваша база данных может справиться с этим, я бы удвоил Решение FerranB и написал необычное решение NATURAL FULL JOIN. Я имею в виду, когда в последний раз у тебя была такая возможность?
SELECT owner, COUNT(dog_name), COUNT(cat_name)
FROM cats
NATURAL FULL JOIN dogs
GROUP BY owner
Честно говоря, никогда :)
Здесь отсутствует пункт
GROUP BY owner, и вам нужно будет квалифицировать свой столбецowner.