«Подзапрос вернул более 1 значения» при объединении таблиц с подзапросом - PullRequest
0 голосов
/ 18 октября 2019

У меня есть две таблицы из этих первых двух запросов, которые я пытаюсь объединить в одну, чтобы показать общее количество поставщиков и общее количество потребителей по штатам.

Я надеюсь сделать это с помощьюподзапрос, но я не могу понять, как использовать оператор GROUP BY и не получить ошибку «подзапрос возвратил более одного значения». Любой совет по третьему запросу был бы очень признателен.

SELECT State, COUNT(Supp_ID) Suppliers
FROM Tb_Supplier
GROUP BY State;

SELECT State, COUNT(Con_ID) Consumers
FROM Tb_Consumer
GROUP BY State;

SELECT s.State, COUNT(s.Supp_ID) Suppliers, (SELECT COUNT(c.Con_ID)
                                             FROM Tb_Consumer c
                                             GROUP BY c.State) Consumers
FROM Tb_Supplier s
GROUP BY s.State

Ответы [ 2 ]

1 голос
/ 18 октября 2019

коррелирует ваш подзапрос с c.State = s.State, поэтому мы можем иметь отображение 1 к 1 между вашими supplier и consumer таблицами

SELECT s.State, COUNT(s.Supp_ID) Suppliers, 
    (SELECT COUNT(c.Con_ID)
     FROM Tb_Consumer c WHERE  c.State = s.State
     GROUP BY c.State) Consumers
FROM Tb_Supplier s
GROUP BY s.State

, другой вариант - использовать left join. более чистый код.

SELECT s.State, COUNT(s.Supp_ID) as Suppliers, COUNT(c.Con_ID) as Consumers 
FROM Tb_Supplier s
LEFT JOIN b_Consumer c ON c.State = s.State
GROUP BY s.State
0 голосов
/ 18 октября 2019
-- I think this is easier to manage, especially if you include more counts.
-- It will include suppliers from states without consumers and 
-- consumers living in states without suppliers.


SELECT State, SUM(Suppliers) Suppliers, SUM(Consumers) Consumers
FROM (
     SELECT State, COUNT(1) Suppliers, 0 Consumers
     FROM Tb_Supplier
     GROUP BY State

     UNION ALL

     SELECT State, 0 Suppliers, COUNT(1) Consumers
     FROM Tb_Consumer
     GROUP BY State) Report
GROUP BY State
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...