Рассчитать итоговый баланс месяц за месяцем - PullRequest
2 голосов
/ 21 апреля 2020

Я хочу рассчитать итоговый баланс месяц за месяцем. У меня есть две таблицы: tblOpenBalance и tblSales. Я хочу этот вывод:

id      Year    Jan         Feb         Mar         Apr         May         Jun         Jul         Aug         Sep         Oct         Nov         Dec     
245854  2019    38105.40    112174.00   98299.00    79053.00    65052.00    61025.57    47511.44    49284.06    99796.15    102556.91   57226.55    82651.33
191265  2018    41049.00    87576.00    85500.00    62385.00    86934.60    55784.00    70604.00    40824.00    37746.78    54491.42    67902.00    93663.80
146002  2017    36461.63    83386.21    84303.27    113673.00   53539.00    57599.75    55795.20    51738.80    44694.01    62729.00    57032.00    76535.40

Значение каждого месяца рассчитывается из следующих элементов:

  1. Значение из tblOpenBalance
  2. Сумма продаж по дебету от предыдущие месяцы - сумма продаж кредита за предыдущие месяцы (если я хочу получить итоговый баланс за февраль 2020 года, эта сумма является суммой продаж, где дата <февраль 2020 года) </li>
  3. сумма продаж (дебет - кредит) из текущий месяц

Окончательная формула должна быть: Значение От tblOpenBalance + (Сумма продаж дебета за предыдущие месяцы - сумма продаж кредита за предыдущие месяцы) + сумма продаж (дебет-кредит) от текущий месяц. Как я могу написать это в mysql в одном запросе для каждого месяца в году, но не с 12 запросами.

tblOpenBalance:

ID     Code      Amount
1      503       1000
2      401       2000

tblSales

CodeDebit   CodeCredit  date    Amount  
503 411 2020-03-25  564.000 
503 411 2020-01-25  123.000 
503 411 2020-01-25  23.000  
503 411 2020-01-25  240.000 
503 411 2020-01-25  36.000  
503 411 2020-01-25  242.000 
503 411 2020-01-25  36.000  
503 411 2020-02-25  72.000  
503 411 2020-02-25  36.000  
503 411 2020-02-25  36.000  
503 411 2020-02-25  543.000 
503 411 2020-02-25  234.000 
503 411 2020-03-25  90.000  
503 411 2020-03-25  324.000 
503 411 2020-03-25  123.000 
503 411 2020-03-25  90.000  
503 411 2020-03-25  84.000  
503 411 2020-03-25  84.000  
503 411 2020-03-25  180.000 

Если в коде нет суммы в tblOpenBalance, сумма в формуле должна быть равна 0. Версия Mysql равна 5.5.37

Мне нужно это в одном запросе, но не повторять 12 раз для каждый месяц в году ...:

  • итоговый баланс за январь 2020 года: значение из tblOpenBalance + сумма продаж за предыдущие месяцы (где дата <январь 2020 года) + сумма продаж с января 2020 года </li>
  • итоговый баланс за февраль 2020 года: значение из tblOpenBalance + сумма продаж за предыдущие месяцы (где дата <февраль 2020 года) + сумма продаж за февраль 2020 года </li>
  • итоговый баланс за март 2020 года: значение из tblOpenBalance + сумма продаж от предыдущие месяцы (где дата <март 2020 г.) + сумма продаж с марта 2020 г. </li>

1 Ответ

2 голосов
/ 21 апреля 2020

Звучит так, будто вы хотите получить итоги только для одного кода. Если так, то примерно так:

select year,
    sum(if(transaction_month <= concat(year,'-01'),amount,null)) Jan,
    sum(if(transaction_month <= concat(year,'-02'),amount,null)) Feb,
    sum(if(transaction_month <= concat(year,'-03'),amount,null)) Mar,
    sum(if(transaction_month <= concat(year,'-04'),amount,null)) Apr,
    sum(if(transaction_month <= concat(year,'-05'),amount,null)) May,
    sum(if(transaction_month <= concat(year,'-06'),amount,null)) Jun,
    sum(if(transaction_month <= concat(year,'-07'),amount,null)) Jul,
    sum(if(transaction_month <= concat(year,'-08'),amount,null)) Aug,
    sum(if(transaction_month <= concat(year,'-09'),amount,null)) Sep,
    sum(if(transaction_month <= concat(year,'-10'),amount,null)) Oct,
    sum(if(transaction_month <= concat(year,'-11'),amount,null)) Nov,
    sum(if(transaction_month <= concat(year,'-12'),amount,null)) "Dec"
from (select distinct(year(date)) year from tblSales where CodeDebit='411' or CodeCredit='411') years
join (
    select date_format(date, '%Y-%m') transaction_month, Amount amount
    from tblSales where CodeCredit='411'
    union all
    select date_format(date, '%Y-%m'), -Amount
    from tblSales where CodeDebit='411'
    union all
    select '0000-00', Amount
    from tblOpenBalance where Code='411'
) transactions on transaction_month <= concat(year,'-12')
group by year
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...