#postgresql
Вопрос:
Даны две таблицы t1 и t2 с одинаковыми именами столбцов:
места, посещения и типы событий
В выходной таблице должны быть места в первом столбце. Во втором столбце должны быть types_of_events из t2.
Комментарии:
1. Я удалил конфликтующие теги СУБД. Пожалуйста, добавьте только один тег для продукта базы данных, который вы действительно используете.
2. Когда вы говорите «количество идентификаторов», вы имеете в виду «количество различных идентификаторов»? Другими словами, должен ли результат содержать (A, 3, 2) или (A, 2, 2)?
3. Отметьте свой вопрос в базе данных, которую вы используете!
Ответ №1:
Используйте объединение вместе с вычисляемым столбцом, чтобы отслеживать источник таблицы:
SELECT
var1,
COUNT(CASE WHEN src = 1 THEN 1 END) AS cnt_1,
COUNT(CASE WHEN src = 2 THEN 1 END) AS cnt_2
FROM
(
SELECT var1, id, 1 AS src FROM t1
UNION ALL
SELECT var1, id, 2 FROM t2
) t
GROUP BY
var1;
Для объяснения запрос внутреннего объединения объединяет два набора данных, однако вводит src
столбец 1 или 2, соответствующий источнику таблицы. Затем во внешнем запросе мы агрегируем var1
и берем отдельные условные подсчеты идентификаторов для каждой таблицы.
Комментарии:
1. @gocode Пожалуйста, проверьте объяснение, данное в конце ответа.
Ответ №2:
Я бы использовал union all
, но с этим поворотом:
select var1, sum(cnt1), sum(cnt2)
from ((select var1, count(*) as cnt1, 0 as cnt2
from t1
group by var1
) union all
(select var1, 0, count(*)
from t2
group by var1
)
) t
group by var1;
Идея состоит в том, что, повторяя столбцы, вы можете избежать case
во внешнем запросе. Вы также можете написать это с помощью full join
. В стандартном SQL это выглядит так:
select *
from (select var1, count(*) as cnt1, 0 as cnt2
from t1
group by var1
) t1 full join
(select var1, 0, count(*)
from t2
group by var1
)
using (var1);
Однако не все базы данных поддерживают этот синтаксис.
Комментарии:
1. @gocode . . . Нужен для чего? Если у вас есть другой вопрос, задайте новый вопрос с соответствующими образцами данных, желаемыми результатами и объяснениями.
Ответ №3:
Это дает вам количество различных идентификаторов (для каждой таблицы), связанных с каждым уникальным var1:
SELECT
COALESCE(t1.var1, t2.var1) var1,
COUNT(DISTINCT t1.id) count1,
COUNT(DISTINCT t2.id) count2
FROM
t1
FULL JOIN t2
ON t1.var1 = t2.var1
GROUP BY
COALESCE(t1.var1, t2.var1);
Результат:
var1 | количество 1 | количество 2 |
---|---|---|
A | 2 | 2 |
B | 1 | 4 |
C | 2 | 1 |
D | 0 | 1 |