Может ли 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
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
9
0
11 958
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий
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)

Здесь отсутствует пункт GROUP BY owner, и вам нужно будет квалифицировать свой столбец owner.

Lukas Eder 07.05.2020 23:33

Я начал с отличного ответа 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

Честно говоря, никогда :)

Lukasz Szozda 07.05.2020 22:55

Другие вопросы по теме