У меня три колонки
year | money | id 2020 100 01 2020 100 01 2019 50 02 2018 50 03 2020 40 04
Результаты должны быть
Year | Money | total people 2020 | 240 | 4
** ПОСКОЛЬКУ первые два идентификатора одинаковы, я пробовал, как показано ниже.
Выберите год, сумму (деньги), количество (различный идентификатор) из таблицы группировать по годам
Но результат показывает 4 человека, что является правильной, но неправильной суммой, так как она считает все деньги.
Вы можете агрегировать, а затем снова агрегировать:
select max(year), sum(money), count(*)
from (select distinct year, money, id
from t
) t;
Потрясающее спасибо, что сработало, я нашел этот ответ, решая эту проблему сегодня. но я действительно ценю то, как вы посмотрели на проблему. Проблема была именно в этом. Бесконечно благодарен
Вы можете использовать SUM() и COUNT(DISTINCT x).
Например:
select
year,
sum(money) as money,
(select count(distinct id) from t) as total_people
from t
where year = 2020
group by year;
Результат:
YEAR MONEY TOTAL_PEOPLE
----- ------ ------------
2020 240 4
См. пример выполнения в db<>fiddle.
Не самый производительный, но если вы хотите избежать производной таблицы, вы можете сделать
select distinct
max(year) over (),
sum(money) over (),
count(*) over ()
from t
group by year, money, id;
И если вы хотите, чтобы это было сгруппировано по годам, вы можете определить разделы в предложении over.
Какой смысл выбирать аналитический максимум (год) в этом запросе? Почему бы просто не показывать каждый год отдельно?
@mathguy Судя по желаемому результату (который не слишком интуитивно понятен), мне показалось, что ОП спрашивает: до 2020 года, сколько у нас денег и сколько разных пользователей?
Если деньги разные для одного и того же идентификатора, года, то что ожидается? Какие деньги следует учитывать?