Есть ли способ выбрать сумму в одном столбце на основе другого столбца DISTINCT, а группировать только по третьему столбцу (дате)

У меня три колонки

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 человека, что является правильной, но неправильной суммой, так как она считает все деньги.

Если деньги разные для одного и того же идентификатора, года, то что ожидается? Какие деньги следует учитывать?

Popeye 18.12.2020 18:55
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
51
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете агрегировать, а затем снова агрегировать:

select max(year), sum(money), count(*)
from (select distinct year, money, id
      from t
     ) t;

Потрясающее спасибо, что сработало, я нашел этот ответ, решая эту проблему сегодня. но я действительно ценю то, как вы посмотрели на проблему. Проблема была именно в этом. Бесконечно благодарен

Akhilesh Sharma 19.12.2020 18:59

Вы можете использовать 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.

Какой смысл выбирать аналитический максимум (год) в этом запросе? Почему бы просто не показывать каждый год отдельно?

user5683823 18.12.2020 21:21

@mathguy Судя по желаемому результату (который не слишком интуитивно понятен), мне показалось, что ОП спрашивает: до 2020 года, сколько у нас денег и сколько разных пользователей?

Radagast 18.12.2020 22:25

Другие вопросы по теме