У меня есть следующий код SQL
SELECT (COUNT(*) filter (WHERE has_a)) AS count_a,
COUNT(*) AS total_count,
process_date
FROM(SELECT process_date::date AS process_date,
(CASE WHEN (columnA > 0) THEN true ELSE false END) AS has_a
FROM my_table)
temptable
GROUP BY process_date
LIMIT 5;
что дает следующую таблицу
Я хочу создать столбец с именем процент_а со значением (count_a/total_count)*100
, сгруппированным по process_date
. Например, для строки 1 новый столбец будет иметь значение 49,4, т.е. (1030/2085)*100.
я пытался
SELECT process_date,
((COUNT(*) filter (WHERE has_a))/COUNT(*) * 100) AS percent_a,
FROM(SELECT process_date::date AS process_date,
(CASE WHEN (columnA > 0) THEN true ELSE false END) AS has_a,
FROM my_table)
temptable
GROUP BY process_date
ORDER BY process_date DESC
LIMIT 1;
Но это только дало 0s.
Как я могу создать столбец для отображения нужного мне процента? Я думаю, что что-то происходит с GROUP BY
, но я не знаю, как это исправить.
Это потому, что count
возвращает целое число, вам просто нужно его привести:
SELECT process_date,
(((COUNT(*) filter (WHERE has_balance))::DOUBLE PRECISION)/COUNT(*) * 100) AS percent_a,
FROM(SELECT process_date::date AS process_date,
(CASE WHEN (columnA > 0) THEN true ELSE false END) AS has_a,
FROM my_table)
temptable
GROUP BY process_date
ORDER BY process_date DESC
LIMIT 1;
Подсказка:
select 1/2 x, 1.0/2 y