powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Учесть вычтенное на прошлых шагах
3 сообщений из 3, страница 1 из 1
Учесть вычтенное на прошлых шагах
    #40079619
slavadan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Подкиньте идею как реализовать запрос
Есть таблица #Itogo, в ней заполненные поля ITOGO1 и ITOGO2
Поля SumITOGO1 и SumITOGO2 это соответственно нарастающие итоги полей ITOGO1 и ITOGO2. Если в поле SumITOGO2 появляется значение меньше 0, его нужно вычесть из поля SumITOGO1 (балансировка таблицы, избавление от минусовых значений).
Все бы хорошо, но присутствует логическая ошибка, последние две строчки результирующей таблицы содержат не верные значения и я не понимаю как правильно составить запрос.
Значения 210 и 280 не учитывают ранее отнятые значения, должно быть 150 и 220 соответственно.
Так же значения 140 и 440 не верны, так как минусование прошло на предыдущих этапах, должно быть 200 и 500

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
DATE1	               ITOGO1	SumITOGO1 ITOGO2 SumITOGO2
2021-01-01 00:00:00	10,00	10,00	0,00	0,00
2021-01-02 00:00:00	20,00	30,00	0,00	0,00
2021-01-03 00:00:00	30,00	10,00	-50,00	0,00
2021-01-04 00:00:00	40,00	40,00	-10,00	0,00
2021-01-05 00:00:00	50,00	90,00	0,00	0,00
2021-01-06 00:00:00	60,00	210,00	200,00	140,00
2021-01-07 00:00:00	70,00	280,00	300,00	440,00

Код: 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.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
if object_id('tempdb..#Itogo') is not null
     drop table #Itogo
CREATE TABLE #Itogo
     (DATE1     smalldatetime,
      ITOGO1    money,
      SumITOGO1 money,
      ITOGO2    money,
      SumITOGO2 money
     )
INSERT INTO #ITOGO
       (DATE1      ,
        ITOGO1    ,       
        ITOGO2            
        )
        VALUES
        ('20210101',10,0) ,
        ('20210102',20,0) ,
        ('20210103',30,-50) ,
        ('20210104',40,-10) ,
        ('20210105',50,0),
        ('20210106',60,200),
        ('20210107',70,300)

if object_id('tempdb..#SumITOGO1') is not null
     drop table #SumITOGO1        
CREATE TABLE #SumITOGO1
     (DATE1     smalldatetime,      
      SumITOGO1 money,       
     ) 
 if object_id('tempdb..#SumITOGO2') is not null
     drop table #SumITOGO2   
 CREATE TABLE #SumITOGO2
     (DATE1     smalldatetime,      
      SumITOGO2 money
     )        
INSERT INTO #SumITOGO1
SELECT 
      DATE1,
      COALESCE(SUM(ITOGO1) OVER(ORDER BY DATE1 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 0) 
  FROM #Itogo with(nolock)
 ORDER BY DATE1 
 INSERT INTO #SumITOGO2
 SELECT 
      DATE1,
      COALESCE(SUM(ITOGO2) OVER(ORDER BY DATE1 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), 0) 
  FROM #Itogo with(nolock)
  --where ITOGO2>0
 ORDER BY DATE1

--SELECT * from Itogo
--select * from #SumITOGO1
--select * from #SumITOGO2

UPDATE i
         SET
            i.SumITOGO1 =  i2.SumITOGO1
        FROM #Itogo i WITH (rowlock, updlock)
  INNER JOIN #SumITOGO1 i2 WITH (nolock)
          ON i2.DATE1 = i.DATE1

UPDATE i
         SET
            i.SumITOGO2 =  i2.SumITOGO2
        FROM #Itogo i WITH (rowlock, updlock)
  INNER JOIN #SumITOGO2 i2 WITH (nolock)
          ON i2.DATE1 = i.DATE1

SELECT * from #Itogo 

update i
        SET i.SumItogo1=i.SumItogo1-ABS(i.SumItogo2)
       FROM #Itogo i
      where i.SumITOGO2<0       

update i
       set i.SumItogo2 =0
      from #Itogo i
     where i.SumItogo2<0

SELECT * from #Itogo 
...
Рейтинг: 0 / 0
Учесть вычтенное на прошлых шагах
    #40079683
spenov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
/*
create table #t (k int, i int, j int)

insert #t values
 (1, 10, 10) 
,(2, 20, 0)
,(3, 15, -5)
,(4, 10, 5)
,(5, 10, -10)

*/

select k
      ,itog=sum(i) over (order by k) + sum(iif(j>0, 0, j)) over (order by k)
  from #t t
  order by k
...
Рейтинг: 0 / 0
Учесть вычтенное на прошлых шагах
    #40079857
slavadan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо за отличную реализацию мастеру spenov

Мой запрос в итоговом варианте будет работать следующим образом

Код: sql
1.
2.
3.
4.
5.
6.
7.
 select  date1,
           ITOGO1,
           SumITOGO1=sum(iif(itogo1>0,itogo1,0)) over (order by date1) + sum(iif(itogo2>0, 0, itogo2)) over (order by date1),
           ITOGO2,
           SumITOGO2=sum(iif(itogo2>0,itogo2,0)) over (order by date1) + sum(iif(itogo1>0, 0, itogo1)) over (order by date1)         
   from #Itogo t
  order by date1
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Учесть вычтенное на прошлых шагах
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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