Не удается раздвоить итоговый баланс по месяцам

#mysql #sql

#mysql #sql

Вопрос:

У меня есть таблица с названием продавца, текущим балансом и датой. мне нужен итоговый баланс за каждый месяц. я попробовал этот код, но это дает мне последний текущий баланс, а не итоговый баланс за месяц.

запрос, который я пытаюсь —

 select  a.`merchant_name`, case when date(a.latest) between '2021-05-01' and '2021-05-31' then b.current_balance /* else null */ end as 'May', case when date(a.latest) between '2021-06-01' and '2021-06-31' then b.current_balance /* else null */ end as 'June', case when date(a.latest) between '2021-07-01' and '2021-07-31' then b.current_balance /* else null */ end as 'July', case when date(a.latest) between '2021-08-01' and '2021-08-31' then b.current_balance /* else null */ end as 'August', case when date(a.latest) between '2021-09-01' and '2021-09-31' then b.current_balance /* else null */ end as 'September', case when date(a.latest) between '2021-10-01' and '2021-10-31' then b.current_balance /* else null */ end as 'October', case when date(a.latest) between '2021-11-01' and '2021-11-31' then b.current_balance /* else null */ end as 'November' from ( select `merchant_name`, date(`created_at`) as created_at, min(`created_at`) as firstt, current_balance, max(`created_at`) as latest  from balances os where `companies_id` in (100001,200002,300003) group by `companies_id` )a inner join balances b on a.latest= b.`created_at` and b.`merchant_name`=a.`merchant_name`;  

Комментарии:

1. Вы получаете последний месяц для каждого продавца в подзапросе и используете его для расчета суммы, поэтому я не могу понять ваше удивление по поводу получения только последнего баланса! Если вам нужны ежемесячные суммы, просто сгруппируйте их по продавцу, году и месяцу и суммируйте значения. Вы должны предоставить примерные данные, ожидаемые результаты и фактические результаты, чтобы мы действительно помогли вам.

Ответ №1:

Сгруппируйте также по году/месяцу в подзапросе.
Но не во внешнем запросе.

 select   a.`merchant_name` , MAX(case when a.yearmonth = 202105 then b.current_balance end) as `May 2021` , MAX(case when a.yearmonth = 202106 then b.current_balance end) as `June 2021` , MAX(case when a.yearmonth = 202107 then b.current_balance end) as `July 21` , MAX(case when a.yearmonth = 202108 then b.current_balance end) as `August 2021` , MAX(case when a.yearmonth = 202109 then b.current_balance end) as `September 2021` , MAX(case when a.yearmonth = 202110 then b.current_balance end) as `October 2021` , MAX(case when a.yearmonth = 202111 then b.current_balance end) as `November 2021` from (  select `companies_id`, `merchant_name`  , CAST(DATE_FORMAT(`created_at`,'%Y%m') AS UNSIGNED) as yearmonth  , max(`created_at`) as latest  from balances  where `companies_id` in (100001, 200002, 300003)  group by `companies_id`, `merchant_name`  , CAST(DATE_FORMAT(`created_at`,'%Y%m') AS UNSIGNED) ) a inner join balances b   on b.`companies_id` = a.`companies_id`  and b.`merchant_name` = a.`merchant_name`  and b.`created_at` = a.latest group by a.`companies_id`, a.`merchant_name`  

Комментарии:

1. Действительно? Мило! И вот я подумал, не превратится ли это в дискуссию, чтобы заставить ее работать. О таких вещах, как формат, который не работает в вашей версии.