Суммирование по МЕСЯЦАМ

AnarAlizadeh
Дата: 31.01.2009 01:37:28
Люди, СПАСАЙТЕ(это не требование, а скромная просба!)
есть ТАБЛИЦА
ID, --ИД
AbonentID, --ИД Абонента
Payment, --Сумма внесенная АБОНЕНТОМ
DateOfPay, --Дата внесения денег
OstalosAbonentu, --Осталось погасить за МЕСЯЦ АБОНЕНТУ
OstalosVsego --Осталось погасить за МЕСЯЦ всем АБОНЕНТАМ

думаю с последнего столбца задачка прояснилась.
Дано:
Несколько абонентов(1,2,3,4), платят за услугу в месяц 72$. Один Абонент за мес. платит 18$
Платить могут и частями - это я в отдельный столбик ввожу, получилось.
Но... мне нужна ваша помошь в столбце OstalosVsego, в ХПроцед. нужно чтоб с 72$ отнимался ВНЕСЕННЫЙ абонентом платеж, НО!!! чтоб в следующем месяце - начиналось бы все ЗАНОВО!
То есть - со следующего месяца опять платеж отнимался бы с 72$.

делал примерно так, не нравится, и не получается:
 WHEN DATEPART(MONTH, GETDATE()) = 1 THEN 
(SELECT 70-SUM(Payment) - @Payment FROM dbo.Plateji WHERE DATEPART(MONTH, DateOfPay) = 1)

считает правильно, но в НОВОМ МЕСЯЦЕ продолжает отнимать со старого месяца, а мне надо чтоб С НОВОГО месяца - он начинал бы отнимать с 72$ по новой..
Надеюсь поняно выразился, СПАСИБО! :)
SIMPLicity_
Дата: 31.01.2009 03:08:37
Что-то вроде?:

select 100000 - sum(unicum_num) from scl_move where date_predm >= dateadd(day, -1 * day(getdate()),getdate())

....

Поля подставьте по необходимости...
SIMPLicity_
Дата: 31.01.2009 03:11:07
--- эта, убрать "равно" нада, ато 31 декабря будет захватываться...
AnarAlizadeh
Дата: 31.01.2009 10:46:14
Спасибо ребят! Но опять как раньше радотает, то есть:
ПЕРВАЯ запись с нового месяца - вычитывает с ПРЕДЫДУЩЕГО месяца, но начинает считать по новой только со ВТОРОЙ записи... :(
Паганель
Дата: 31.01.2009 11:05:59
Я вот ничего не понял в этой задаче
Автор, расскажите, пожалуйста о ней подробнее:

0) Что делают в таблице поля OstalosAbonentu и OstalosVsego,
почему не вычисляются при необходимости?

1) Очень хотелось бы увидеть пример тестовых данных и желаемого результата
(на несколько месяцев и абонентов желательно, с разными ежемесячными "абонплатами")

2) Откуда берутся цифры 72$ и 18$ ? Откуда в Вашем запросе цифра 70 ?

3) Что значит "отнимался ВНЕСЕННЫЙ абонентом платеж"? Нужен update или select?

4) Если абонент должен вносить 72$, а внес 100$, что будет в поле OstalosAbonentu?
А на следующий месяц перенесется? А на OstalosVsego как повлияет?
AnarAlizadeh
Дата: 31.01.2009 11:29:37
Уважаемый Паганель! Рад что откликнулись!
70 - это опечатка, должно быть 72 - это месячная плата за каб.телевидение, к=оторое покрывают 4 абонента, то есть по 18$ каждый.
"OstalosAbonentu" - Абонент может вносить и по частям в течении месяца, но это меня пока не интересует.
важно мне вот что:
"OstalosVsego " - в этой колонне все ПЛАТЕЖИабонентов ВЫЧИТЫВАЮТСЯ с 72! И так в течении всего МЕСЯЦА!
НО!!! со следующего месяца - надо чтоб отчет начинался заново! результат предыдущего месяца пока мне не важен.
мне главное пока сделать этот счетчик - начинающий вычитывать с 72$ по новой - с каждого месяца...
Все это для ИНСЕРТ - в Хранимой Поцедуре.

вот таблица(тест)
ID     AbonentID   Payment       DateOfPay             OstalosAbonentu   OstalosVsego 

1 1 4,0000 30.01.2009 14:45:07 -14,0000 66,0000
5 2 8,0000 30.01.2009 14:46:33 -10,0000 58,0000
6 3 8,0000 30.01.2009 14:46:52 -10,0000 50,0000
229 3 5,0000 31.01.2009 2:33:39 -5,0000 45,0000
256 1 7,0000 11.02.2009 12:20:28 -11,0000 38,0000
257 1 7,0000 11.02.2009 12:20:33 -4,0000 63,0000
258 3 7,0000 11.02.2009 12:20:50 -11,0000 56,0000


Обратите внимание на: OstalosVsego, и на ID: 229 и 256!!! с ИД 256 пошел новый месяц, НО "OstalosVsego " вычел 7$ со старого месяца, а нодо бы уж чтоб по новому начал, то есть 72 - 7
Надеюсь удалось понятно выразить мысль...
Спасибо!
Паганель
Дата: 31.01.2009 11:55:04
Во-первых, 72 минус 4 никак не получается 66, а получается почему-то 68
Значит, уже первая строка (где ID == 1) у Вас неверная, дальнейшие из-за нее - также

Во-вторых, Вы не ответили на мой четвертый вопрос
Так что пока имеем следующее:
declare @t table(ID int, AbonentID int, Payment decimal(10, 2), DateOfPay datetime)
insert into @t(ID, AbonentID, Payment, DateOfPay)
select   1, 1, 4.00, '20090130 14:45:07' union all
select   5, 2, 8.00, '20090130 14:46:33' union all
select   6, 3, 8.00, '20090130 14:46:52' union all
select 229, 3, 5.00, '20090131 02:33:39' union all
select 256, 1, 7.00, '20090211 12:20:28' union all
select 257, 1, 7.00, '20090211 12:20:33' union all
select 258, 3, 7.00, '20090211 12:20:50'

select ID, AbonentID, Payment, DateOfPay
      ,72.00 - (select sum(Payment)
                  from @t as c
                 where convert(char(6), c.DateOfPay, 112) = convert(char(6), p.DateOfPay, 112)
                   and (   c.DateOfPay < p.DateOfPay
                        or (    c.DateOfPay = p.DateOfPay 
                            and c.ID <= p.ID
                            )
                        )
                ) as OstalosVsego
  from @t as p

ID          AbonentID   Payment                                 DateOfPay               OstalosVsego
----------- ----------- --------------------------------------- ----------------------- ------------
1           1           4.00                                    2009-01-30 14:45:07.000 68.00
5           2           8.00                                    2009-01-30 14:46:33.000 60.00
6           3           8.00                                    2009-01-30 14:46:52.000 52.00
229         3           5.00                                    2009-01-31 02:33:39.000 47.00
256         1           7.00                                    2009-02-11 12:20:28.000 65.00
257         1           7.00                                    2009-02-11 12:20:33.000 58.00
258         3           7.00                                    2009-02-11 12:20:50.000 51.00

(7 row(s) affected)
AnarAlizadeh
Дата: 31.01.2009 12:25:13
Паганель, в коде было 70, а не 72.. Потому так посчитал...
Спасибо, Но делает тоже самое.
Понимаете, У неня в ХП инсертятся эти данные под Кейсом(непример):
(Тут ваш код), WHEN DATEPART(MONTH, getdate()) = 1(2,3,4....12) и так по всем 12 месяцам... огромный получается код
@OstalosVsego =
CASE
WHEN DATEPART(MONTH, getdate()) = 1 THEN 
(72.00 - (select sum(Payment)
                  from dbo.Plateji as c
                 where convert(char(6), c.DateOfPay, 112) = convert(char(6), g.DateOfPay, 112)
                   and (   c.DateOfPay < g.DateOfPay
                        or (    c.DateOfPay = g.DateOfPay 
                            and c.ID <= g.ID
                            )
                        )
                ) 
END
FROM Plateji as g


--Потом инсертим объявленный @OstalosVsego в таблицу:

INSERT INTO Plateji 
(
тататататата,
OstalosVsego )
VALUES
(
тататата,
@OstalosVsego)
Вот так и инсертится @OstalosVsego в таблицу.
А 4-ый вопрос - пока не важен, надо мне пока с этим разобратся... :(
Спасибо!
AnarAlizadeh
Дата: 31.01.2009 12:27:25
а из КЛИЕНТА передаются только
@AbonentID,
@Payment

все остальное считается - вычитывается в хранимке...
Паганель
Дата: 31.01.2009 12:32:07
AnarAlizadeh
Спасибо, Но делает тоже самое.
Нет, не то же самое
У Вас февраль "начался" с записи, у которой ID==257,
А у меня - с записи, у которой ID==256, что, насколько я понял, и есть то что надо, так ведь?

AnarAlizadeh
(Тут ваш код), WHEN DATEPART(MONTH, getdate()) = 1(2,3,4....12) и так по всем 12 месяцам... огромный получается код
Приведите весь, посмотрим, где можно упростить...