Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Samat Samat Member Откуда: Сообщений: 16 |
В ниже указанном коде данные из последнего CTE нужно добавить в таблицу, при этом пересчитать переменную @Total. Как добавить данные в таблицу и продолжить вычитывать @Total.declare @i int, @Total money, @Oplata money; set @Total = 100 set @i = 1; while @Total > 0 begin with Payments as ( select * from dbo.FD_Payments where LINK = 2), Bills as ( select *, isnull(SUM(N_Amount) OVER (PARTITION BY F_Subscr, YEAR(D_Date), MONTH(D_Date)),0) AS [Месячный Долг], case when dense_rank() over (partition by F_Subscr, YEAR(D_Date), MONTH(D_Date) order by D_Date desc) = 1 then isnull(SUM(N_Amount) OVER (PARTITION BY F_Subscr, YEAR(D_Date), MONTH(D_Date)),0) else 0 end as Ранг, ROW_NUMBER() OVER (PARTITION BY F_Subscr ORDER BY D_Date) AS Номер FROM dbo.FD_Bills WHERE F_subscr IN (SELECT F_Subscr FROM Payments) AND N_Amount <> 0), Ddd as (select p.LINK as F_Payments, b.LINK as F_Bills, C_Sale_Items, Ранг, case when @Total > b.[Месячный Долг] then b.[Месячный Долг] else @Total end *b.N_Amount_Rest/b.[Месячный Долг] as Распределение from Payments p JOIN Bills b on p.F_Subscr = b.F_Subscr where b.Номер = @i) select @Total = @Total - (select case when Ранг <> 0 then case when @Total > Ранг then Ранг else @Total end else 0 end from Ddd) set @i = @i + 1 select @Total end; |
12 ноя 19, 19:13 [22014772] Ответить | Цитировать Сообщить модератору |
alexeyvg Member Откуда: Moscow Сообщений: 31783 |
|
||||
12 ноя 19, 19:22 [22014776] Ответить | Цитировать Сообщить модератору |
Kopelly Member Откуда: Красноярск Сообщений: 289 |
Мне кажется вместо dense_rank() правильнее использовать row_number() - иначе будет задвоение при нескольких счетах от меньшей даты в месяце.declare @i int, @Total money, @Oplata money; set @Total = 100 set @i = 1; drop table if exists #tmp; create table #tmp (F_Payments bigint, F_Bills bigint, C_Sale_Items varchar(200), Ранг money, Распределение money) declare @t table (Ранг money) while @Total > 0 begin with Payments as ( select * from dbo.FD_Payments where LINK = 2), Bills as ( select *, isnull(SUM(N_Amount) OVER (PARTITION BY F_Subscr, YEAR(D_Date), MONTH(D_Date)),0) AS [Месячный Долг], case when row_number() over (partition by F_Subscr, YEAR(D_Date), MONTH(D_Date) order by D_Date desc) = 1 then isnull(SUM(N_Amount) OVER (PARTITION BY F_Subscr, YEAR(D_Date), MONTH(D_Date)),0) else 0 end as Ранг, ROW_NUMBER() OVER (PARTITION BY F_Subscr ORDER BY D_Date) AS Номер FROM dbo.FD_Bills WHERE F_subscr IN (SELECT F_Subscr FROM Payments) AND N_Amount <> 0), Ddd as (select p.LINK as F_Payments, b.LINK as F_Bills, C_Sale_Items, Ранг, case when @Total > b.[Месячный Долг] then b.[Месячный Долг] else @Total end *b.N_Amount_Open/b.[Месячный Долг] as Распределение from Payments p JOIN Bills b on p.F_Subscr = b.F_Subscr where b.Номер = @i) Insert into #tmp output inserted.Ранг into @t Select * From Ddd select @Total = @Total - (select case when Ранг <> 0 then case when @Total > Ранг then Ранг else @Total end else 0 end from @t) delete @t set @i = @i + 1 select @Total end; |
13 ноя 19, 11:35 [22015149] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |