Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как добавить полученный запрос в таблицу  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Как добавить полученный запрос в таблицу  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31355
Samat Samat
Как добавить данные в таблицу и продолжить вычитывать @Total.
Никак.
12 ноя 19, 19:22    [22014776]     Ответить | Цитировать Сообщить модератору
 Re: Как добавить полученный запрос в таблицу  [new]
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 Ответить