Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Теория SQL (как размазать сумму по строкам)  [new]
Soldat
Member

Откуда: Москва
Сообщений: 854
Граждане поможите

Надо запросом сумму равномерно размазать по строкам, на примере будет проще объяснить.

Есть таблица PLAN с полями
ID | PLAN_SUM
------------------
1 | 100
2 | 200
3 | 50

и есть сумма, ну скажем 200, кстати тоже из запроса
(Select SUM(Q) from SomeTable)
как получить такой результат

ID | PLAN_SUM | RESULT
----------------------------
1 | 100 | 0
2 | 200 | -100
3 | 50 | -50

Спасибо за внимание
22 янв 04, 13:04    [502545]     Ответить | Цитировать Сообщить модератору
 Re: Теория SQL (как размазать сумму по строкам)  [new]
www.fun4me.narod.ru
Member

Откуда: Moscow
Сообщений: 2406
И где тут равномерность? Пропорционально что-ли разделить хотите?
22 янв 04, 13:35    [502638]     Ответить | Цитировать Сообщить модератору
 Re: Теория SQL (как размазать сумму по строкам)  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
FAQ для начала надо бы глянуть.
22 янв 04, 13:39    [502651]     Ответить | Цитировать Сообщить модератору
 Re: Теория SQL (как размазать сумму по строкам)  [new]
АлексейК
Member

Откуда: http://www.msdatabase.ru , Moscow
Сообщений: 7683
Бюджетик ?
распределение квартала по месяцам ?

мес = сумма квартала / 3

если нужно увидеть разницу

разница = (сумма квартала / 3) - значение месяца
22 янв 04, 13:40    [502654]     Ответить | Цитировать Сообщить модератору
 Re: Теория SQL (как размазать сумму по строкам)  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Если нужно равномерно раскидать DispSum то:

1. сначала получаете сумму всего документа DocSum
2. LineSum=LineSum * (1+DispSum/DocSum)
3. Радуетесь результату... :)

онО ? или не онО ????? :)
22 янв 04, 16:22    [503114]     Ответить | Цитировать Сообщить модератору
 Re: Теория SQL (как размазать сумму по строкам)  [new]
Soldat
Member

Откуда: Москва
Сообщений: 854
Я приношу извеинения, видимо я неверно выразился,
надо следующее
Сравниваем общую сумму с значением из первой строки
если от общей суммы что то осталось, то этот остаток переносим во вторую строку.

Надо увидеть на какие строки хватило суммы , а на какие нет.
22 янв 04, 16:33    [503136]     Ответить | Цитировать Сообщить модератору
 Re: Теория SQL (как размазать сумму по строкам)  [new]
LSV
Member [заблокирован]

Откуда: Киев
Сообщений: 30817
Так это списание остатков по FIFO ?????? :)

Тут одним запросом не сделаешь....
Ну курсором можно...
Хотя если много товаров, то медленно будет.
подсказка:
можно сделать цикл с 3-мя временными таблицами
к-во итерраций равно МАХ+1 к-ву разбросов по одному из товаров.
критерий остановки цикла : сумма для разброса =0

наверно мутновато написал... :)
22 янв 04, 16:42    [503161]     Ответить | Цитировать Сообщить модератору
 Re: Теория SQL (как размазать сумму по строкам)  [new]
ASCRUS
Member

Откуда: МО Электросталь
Сообщений: 5994
К сожалению у меня сейчас под рукой MSSQL нет, поэтому предлагаю решение на TSQL ASA, в принципе насколько я помню особых отличий нет, в update MSSQL так же поддерживает переменные, так что по идее должно сработать, в крайнем случае подправите скриптик:

begin
declare @Total numeric(12, 2);

-- Тестовая таблица

create table #Test (
Id int not null primary key, -- Код

Plan_Sum numeric(12, 2) not null, -- Плановая сумма

Value numeric(12, 2) not null default 0 -- Уже оплаченная сумма

);

-- Заносим тестовые суммы

insert into #Test (Id, Plan_Sum, Value)
select 1, 100, 50 -- тут уже было оплачено 50 рублей

union all
select 2, 200, 0
union all
select 3, 50, 0;

-- Разбрасываемая сумма

set @Total = 200;

-- Разброска суммы,

-- за приоритет разбивки возьмем по возрастанию Id

update #Test
set Value = case
when @Total < 0 then Value
when Plan_Sum - (Value + @Total) >= 0 then Value + @Total
else Plan_Sum
end,
@Total = @Total - (case
when @Total < 0 then 0
when Plan_Sum - (Value + @Total) >= 0 then @Total - Value
else Plan_Sum - Value
end)
where Value < Plan_Sum
order by Id;

-- Сколько осталось после разброски

select @Total as Ostatok;

-- Что получилось

select *
from #Test
order by Id;
end

Соответствующе в Value после выполнения этого скрипта будет:

Id Plan_Sum Value
1 100.00 100.00
2 200.00 150.00
3 50.00 0.00

Ну а @Total будет равно нулю, так как была раскидана вся сумма полностью.
22 янв 04, 20:40    [503540]     Ответить | Цитировать Сообщить модератору
 Re: Теория SQL (как размазать сумму по строкам)  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
У меня скрипта нет под рукой, но FIFO реализовывалось 2 запросами через временную таблицу. Завтра поищу - может найду. Кстати, с LIFO было намного сложнее.
22 янв 04, 21:08    [503569]     Ответить | Цитировать Сообщить модератору
 Re: Теория SQL (как размазать сумму по строкам)  [new]
Paul Chabinsky
Member

Откуда:
Сообщений: 322
--таблица пополнения


CREATE TABLE [dbo].[plan] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[summ] [int] NULL ,
[result] [int] NULL
) ON [PRIMARY]
GO
--первичный ключ, порядок сортировки именно DESC т.к. FIFO

ALTER TABLE [dbo].[plan] WITH NOCHECK ADD
CONSTRAINT [PK_plan] PRIMARY KEY CLUSTERED
(
[id] DESC
) ON [PRIMARY]
GO
--процедура "размазывания" суммы

create proc upd_summ
(
@s int
)
as
if (@s>0) return
declare @r int
set @r = 0
begin tran
update [plan] set
@r = case when abs(@s)>summ then -summ else @s end,
summ = summ + @r,
@s = @s - @r,
result = isnull(result,0) + @r
if (@s<0) rollback tran else commit tran
GO
--небольшой тест

delete [plan]
insert into [plan] (summ) values (100)
insert into [plan] (summ) values (20)
insert into [plan] (summ) values (50)
insert into [plan] (summ) values (35)
insert into [plan] (summ) values (10)
insert into [plan] (summ) values (200)
insert into [plan] (summ) values (150)
insert into [plan] (summ) values (60)
select * from [plan]
exec upd_summ -200
select * from [plan]
exec upd_summ -200
select * from [plan]
exec upd_summ -200
select * from [plan]

P.S. Только внимательнее с PRIMARY KEY.
22 янв 04, 22:53    [503627]     Ответить | Цитировать Сообщить модератору
 Re: Теория SQL (как размазать сумму по строкам)  [new]
Paul Chabinsky
Member

Откуда:
Сообщений: 322
ой я загнался )
перепутал немножко :) FIFO с LIFO %))))
примари кей должен быть не деск а аск )
сорри за невнимательность :)
22 янв 04, 22:56    [503630]     Ответить | Цитировать Сообщить модератору
 Re: Теория SQL (как размазать сумму по строкам)  [new]
Paul Chabinsky
Member

Откуда:
Сообщений: 322
В общим если надо LIFO то примари кей DESC, если FIFO то ASC
22 янв 04, 22:59    [503631]     Ответить | Цитировать Сообщить модератору
 Re: Теория SQL (как размазать сумму по строкам)  [new]
Aleksey777
Member

Откуда: Novosibirsk
Сообщений: 227
я как то задавал примерно такой же вопрос
посмотри тут https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=52359&hl=
23 янв 04, 06:41    [503780]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить