Объединить две группы? - PullRequest
0 голосов
/ 11 октября 2018

У меня есть два запроса:

SELECT to_char(pubdate, 'YYYY-MM') pub_month, COUNT(*) total 
FROM books 
GROUP BY pub_month;

и

SELECT to_char(pubdate, 'YYYY-MM') pub_month, COUNT(*) total_bought 
FROM books 
WHERE purchased=true 
GROUP BY pub_month;

Можно ли объединить их так, чтобы результат составил

+-----------+-------+--------------
| pub_month | total | total_bought 
+-----------+-------+--------------
|   2018-10 |     5 |            2
|   2018-09 |    10 |            7

Ответы [ 3 ]

0 голосов
/ 11 октября 2018
SELECT to_char(pubdate, 'YYYY-MM') pub_month
           , COUNT(*) total
           , SUM(CASE WHEN purchased=true THEN 1 ELSE 0 END) total_bought 
FROM books 
GROUP BY pub_month;
0 голосов
/ 11 октября 2018

Вы можете сделать это одним SQL-запросом.

SELECT to_char(pubdate, 'YYYY-MM') pub_month, COUNT(*) total , 
       sum(case when purchased=true then 1 else 0 end) total_bought 
FROM books 
GROUP BY pub_month;
0 голосов
/ 11 октября 2018

Вы можете использовать предложение FILTER:

Предложение фильтра расширяет агрегатные функции (sum, avg, count,…) дополнительным предложением where. Результат агрегата строится только из тех строк, которые также удовлетворяют дополнительному условию where.

SELECT to_char(pubdate, 'YYYY-MM') pub_month
    , COUNT(*) FILTER (WHERE purchased) total_bought
    , COUNT(*) total 
FROM books 
GROUP BY pub_month;

или условное агрегирование:

SELECT to_char(pubdate, 'YYYY-MM') pub_month
    , SUM(CASE WHEN purchased THEN 1 ELSE 0 END) total_bought
    , COUNT(*) total 
FROM books 
GROUP BY pub_month;

Дополнительное примечание: WHERE purchased=true <=> WHERE purchased

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...