Объединение двух запросов в две колонки

#sql #postgresql #subquery

#sql #postgresql #подзапрос

Вопрос:

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

ПРОБЛЕМА У меня есть оператор WITH, в котором указаны все критерии для того, что я хочу найти, тогда я хочу, чтобы вы выполнили два запроса SELECT, по одному для каждого пользователя (одновременно будет выполняться поиск только для 2 пользователей)

ДАННЫЕ Данные состоят из времени и количества, в предложении with будут критерии, при которых в запросах будет использоваться только имя пользователя.

ПРИМЕР

 HOUR AMOUNT
01 200
02 300
03 500
04 800
  

Используя ОБЪЕДИНЕНИЕ, я получаю оба запроса в одном столбце

 HOUR AMOUNT
01 200
01 75
02 300
02 50
03 500
03 21
04 800
04 300
  

Но я просто хочу, чтобы второй запрос отображался в новом столбце

 HOUR AMOUNT AMOUNT2
01 200     75   
02 300     50
03 500     21
04 800     300
  

Я упростил SQL, чтобы он не был слишком длинным:

 WITH My_With AS (
...
)


SELECT time, count(time) AS Column_1
FROM My_With
WHERE
    username= 'jon' 
GROUP BY time

UNION

SELECT time, count(time) AS Column_2
FROM My_With
WHERE
    username= 'bob' 
GROUP BY time
ORDER BY time   
;
  

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

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

1. В примере данных есть столбец «час», но для запросов указано время.

Ответ №1:

Я думаю, вы можете делать то, что хотите, с помощью условной агрегации:

 SELECT time, 
       COUNT(*) FILTER (WHERE username = 'jon') as cnt_jon,
       COUNT(*) FILTER (WHERE username = 'bob') as cnt_bob
FROM My_With
GROUP BY time;
  

Или, с меньшим количеством ввода:

 SELECT time, 
       SUM( (username = 'jon')::int ) as cnt_jon,
       SUM( (username = 'bob')::int ) as cnt_bob
FROM My_With
GROUP BY time;
  

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

1. Ты легенда