Oracle / SQL — Объединение подсчетов из «несвязанных» несвязанных таблиц

#sql #oracle #count #union

#sql #Oracle #подсчет #объединение

Вопрос:

Давайте предположим, что у меня две таблицы GOOD и BAD , в которых хранятся записи для создания виджетов. Мои таблицы выглядят следующим образом

 Widget      Good
----------------
Widget A    Y
Widget A    Y
Widget B    Y

Widget      Bad
----------------
Widget A    Y
Widget B    Y
  

У меня есть эти два основных запроса

 select count(*) as good from table_good where widget = 'Widget A' and Good = 'Y'
select count(*) as bad from table_bad where widget = 'Widget A' and Bad = 'Y'
  

Это привело бы к двум таблицам, подобным этой

 good
----
2

bad
---
1
  

Я хотел бы объединить их в один запрос, где я бы вернул таблицу с одной записью, которая выглядит следующим образом

 good    bad
-----------
2       1
  

Может кто-нибудь указать мне, как это сделать. Я думал, что выполнение объединения и настройка поддельных столбцов в других выбранных таблицах сделают это, но я вернул правильную схему таблицы, но у меня было две отдельные записи.

Спасибо!

Комментарии:

1. @Andriy M — Вы были правы, я провел некоторое тестирование, и GROUP BY с этим запросом все получилось не так, как я ожидал. Спасибо!

Ответ №1:

Попробуйте это:

 SELECT (SELECT COUNT(*) AS good 
        FROM   table_good 
        WHERE  widget = 'Widget A' 
               AND good = 'Y') AS good, 
       (SELECT COUNT(*) AS bad 
        FROM   table_bad 
        WHERE  widget = 'Widget A' 
               AND bad = 'Y')  AS bad 
FROM   dual  
  

Ответ №2:

Другой способ заключается в использовании FULL JOIN :

 SELECT COALESCE(A.widget,B.widget) AS Widget, COUNT(G.*) AS Good, COUNT(B.*) AS Bad
FROM table_good G
FULL OUTER JOIN table_bad B
ON G.widget = B.widget AND A.Good = B.Bad
WHERE (G.widget = 'Widget A' OR B.Widget = 'Widget A') 
AND (G.Good = 'Y' OR B.Good = 'Y')