powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Накопительный итог
2 сообщений из 2, страница 1 из 1
Накопительный итог
    #40107600
Skilled
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер, коллеги!

Прошу помощи в решении такой задачи

MSSQL 2012

Есть две таблицы:

Приход товаров на склад по месяцам, количество и срок годности товара.
IncomeDate IncomeAmount ExpiredDate2020.09.30 2.08 2021.12.312020.10.31 2.08 2021.12.312020.11.30 2.08 2021.12.312020.12.31 2.08 2021.12.312021.01.31 2.08 2021.12.312021.02.28 2.08 2021.12.312021.03.31 2.08 2021.12.312021.04.30 2.08 2021.12.312021.05.31 2.08 2021.12.312021.06.30 2.08 2021.12.312021.07.31 2.08 2021.12.312021.08.31 2.12 2021.12.312021.09.30 2.08 2022.12.312021.10.31 2.08 2022.12.312021.11.30 2.08 2022.12.312021.12.31 2.08 2022.12.312022.01.31 2.08 2022.12.31

И есть таблица списаний товара:
OutcomeDate OutcomeAmount2020.11.30 12020.12.31 22021.07.31 42021.08.31 42021.09.30 102022.02.28 10

Нужно получить баланс товара на каждый месяц за вычетом списаний и просроченного товара
iRowNumber date ExpiredDate IncomeAmount OutcomeAmount IncomeCumulativeAmount OutcomeCumulativeAmount Balance1 2020-09-30 2021-12-31 2.08 NUL 2.08 NULL NULL2 2020-10-31 2021-12-31 2.08 NUL 4.16 NULL NULL3 2020-11-30 2021-12-31 2.08 1.00 6.24 1.00 5.244 2020-12-31 2021-12-31 2.08 2.00 8.32 3.00 5.325 2021-01-31 2021-12-31 2.08 NUL 10.40 3.00 7.406 2021-02-28 2021-12-31 2.08 NUL 12.48 3.00 9.487 2021-03-31 2021-12-31 2.08 NUL 14.56 3.00 11.568 2021-04-30 2021-12-31 2.08 NUL 16.64 3.00 13.649 2021-05-31 2021-12-31 2.08 NUL 18.72 3.00 15.7210 2021-06-30 2021-12-31 2.08 NUL 20.80 3.00 17.8011 2021-07-31 2021-12-31 2.08 4.00 22.88 7.00 15.8812 2021-08-31 2021-12-31 2.12 4.00 25.00 11.00 14.0013 2021-09-30 2022-12-31 2.08 10.0 27.08 21.00 6.0814 2021-10-31 2022-12-31 2.08 NUL 29.16 21.00 8.1615 2021-11-30 2022-12-31 2.08 NUL 31.24 21.00 10.2416 2021-12-31 2022-12-31 2.08 NUL 33.32 21.00 12.3217 2022-01-31 2022-12-31 2.08 NUL 35.40 21.00 10.40null 2022-02-28 NULL NULL 10.0 35.40 31.00 0.40

Пробовал сделать вот так, но не могу понять как правильно вычесть просроченный товар, чтобы он во второй партиции не был включен в итог, сейчас он не включен в итог только первой строки второй партиции. Т.е. в последней строке должно быть 0.4, а не 4.4

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
    declare @income table(iRowNumber int identity(1, 1), IncomeDate date, IncomeAmount decimal(18, 6), ExpiredDate date);
	declare @outcome table(oRowNumber int identity(1, 1), OutcomeDate date, OutcomeAmount decimal(18, 6));
    
    insert @income (IncomeDate, IncomeAmount, ExpiredDate)
        values
             ('20200930', 2.08, '20211231')
            ,('20201031', 2.08, '20211231')
            ,('20201130', 2.08, '20211231')
            ,('20201231', 2.08, '20211231')
            ,('20210131', 2.08, '20211231')
            ,('20210228', 2.08, '20211231')
            ,('20210331', 2.08, '20211231')
            ,('20210430', 2.08, '20211231')
            ,('20210531', 2.08, '20211231')
            ,('20210630', 2.08, '20211231')
            ,('20210731', 2.08, '20211231')
            ,('20210831', 2.12, '20211231')
            ,('20210930', 2.08, '20221231')
            ,('20211031', 2.08, '20221231')
            ,('20211130', 2.08, '20221231')
            ,('20211231', 2.08, '20221231')
            ,('20220131', 2.08, '20221231')

    insert @outcome  (OutcomeDate, OutcomeAmount)
        values
           ('20201130', 1) 
          ,('20201231', 2)
          ,('20210731', 4)
          ,('20210831', 4)
          ,('20210930', 10)
          ,('20220228', 10);


select   i.iRowNumber
        ,isnull(i.IncomeDate, o.OutcomeDate) [Date]
        ,i.ExpiredDate
        ,i.IncomeAmount
        ,o.OutcomeAmount
        ,IncomeCumulativeAmount = cast(sum(isnull(i.IncomeAmount, 0)) over(order by isnull(i.IncomeDate, o.OutcomeDate)) as decimal(6, 2))
        ,OutcomeCumulativeAmount = cast(sum(o.OutcomeAmount) over(order by isnull(i.IncomeDate, o.OutcomeDate)) as decimal(6, 2))
        
        ,Balance = cast(sum(isnull(i.IncomeAmount, 0)) over(order by isnull(i.IncomeDate, o.OutcomeDate)) -
        case when 
              sum(isnull(i.IncomeAmount, 0)) over(order by isnull(i.IncomeDate, o.OutcomeDate))
            - sum(i.IncomeAmount) over(partition by isnull(i.ExpiredDate, o.OutcomeDate) order by isnull(i.IncomeDate, o.OutcomeDate))
            - sum(o.OutcomeAmount) over(order by isnull(i.IncomeDate, o.OutcomeDate))  > 0
        then  sum(isnull(i.IncomeAmount, 0)) over(order by isnull(i.IncomeDate, o.OutcomeDate))
            - sum(i.IncomeAmount) over(partition by isnull(i.ExpiredDate, o.OutcomeDate) order by isnull(i.IncomeDate, o.OutcomeDate))
            - sum(o.OutcomeAmount) over(order by isnull(i.IncomeDate, o.OutcomeDate))
        else 0 end
        - sum(o.OutcomeAmount) over(order by isnull(i.IncomeDate, o.OutcomeDate)) as decimal(6, 2))
    from @income i
        full join @outcome o
            on o.OutcomeDate = i.IncomeDate
    order by isnull(i.IncomeDate, o.OutcomeDate)

...
Рейтинг: 0 / 0
Накопительный итог
    #40107813
DanilaSP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Судя по запросу тут у Вас 3, а не 2 патриции.
Также я не понимаю, откуда взялось значение 10.40 в предпоследней строке. Если я правильно понял условие, нужно взять строки, в которых Expired date не меньше, чем date, и вычесть суммарный Outcome из суммарного Income. Взяв строки 13-17 в предпоследней строке получим 0.40.
Что-то мне подсказывает, что нужно писать подзапрос (не понимаю, какую сумму Вы сравниваете с 0).
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Накопительный итог
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]