Прежде всего: я удивлен, что отдельные запросы выполняются.Вы не сможете использовать имя столбца псевдонима в HAVING
, поскольку HAVING
встречается до SELECT
.
С UNION
вы удаляете дубликаты.Таким образом, вы подсчитали месяцы, когда количество постов было точно таким же, как и не постов, только половина.Это то, что вы после?Кажется странным.
В любом случае, с вашим запросом вы получите несколько строк результатов, и вы не сможете определить, какие из них предназначены для постов, а какие для не-постов.
(И просто таквы знаете: если тип может быть нулевым, это не будет учитываться ни в одной строке, потому что неизвестное значение NULL не считается ни равным, ни неравным для 'Post'.)
Вот два способа написания запроса:
Одна строка в месяц и введите
SELECT yr, mh, tp, COUNT(*)
FROM
(
SELECT
TO_CHAR(createdatutc, 'YYYY') AS yr,
TO_CHAR(createdatutc, 'MM') AS mh,
CASE WHEN type = 'Post' THEN 'Post' ELSE 'other' END AS tp
FROM conversations
WHERE EXTRACT(YEAR FROM createdatutc) = 2018
) yr2018
GROUP BY yr, mh, tp
ORDER BY yr, mh, tp;
Одна строка в месяц
SELECT
yr, mh,
COUNT(CASE WHEN type = 'Post' THEN 1 END) AS count_posts,
COUNT(CASE WHEN type <> 'Post' THEN 1 END) AS count_nonposts
FROM
(
SELECT
TO_CHAR(createdatutc, 'YYYY') AS yr,
TO_CHAR(createdatutc, 'MM') AS mh,
type
FROM conversations
WHERE EXTRACT(YEAR FROM createdatutc) = 2018
) yr2018
GROUP BY yr, mh
ORDER BY yr, mh;
Вы можете сделать это без подзапросов (производных таблиц), но тогда выприходится повторять одни и те же выражения снова и снова.