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

Откуда: KYIV
Сообщений: 4613
Есть одна выборка, но её необходимо запускать по каждому месяцу. Я хочу сделать цикл, добавив столбец с месяцем.
Сделал так
drop table #tmpRes
set dateformat dmy
declare @Dat datetime
declare @Datcount integer
select @Datcount=1
select @Dat='20111001 00:00:00.000'
while (@Datcount >= 1) 
begin
select 
 cast(@Dat as DATE) Mes,
year(p.PaymentDate) y,
       sum(isnull(ph.PwrSum, PSum) + isnull(ps.PwrSum,0)) kVt_ch,
       sum(case when isnull(ph.PwrSum, PSum) + isnull(ps.PwrSum,0) - isnull(pay.PaySum, 0)>0
       then isnull(ph.PwrSum, PSum) + isnull(ps.PwrSum,0) - isnull(pay.PaySum, 0) else 0 end) SaldoDbt,
       sum(payCM.PaySum) TurnCrd 
into #tmpRes       
from Penalty p join Abonent a on p.AbonentId=a.AbonentId
     left join
     (select PenaltyId, PwrSum, Pwr from PenaltyHistory ph
      where HisDate = (select max(HisDate) from PenaltyHistory ph1 where ph1.PenaltyId = ph.PenaltyId)) ph on p.PenaltyId = ph.PenaltyId
     left join (select PenaltyId, sum(PwrSum) PwrSum, sum(Pwr) Pwr from PenaltyStorno
     where PaymentDate<=@Dat
     group by PenaltyId) ps on p.PenaltyId = ps.PenaltyId
     left join (select PenaltyId,max(PayDate) PayDate,sum(PaySum) PaySum from
     (select PenaltyId,PaySum, PayDate from Payments py join Penalty p1 on p1.Number=py.DocNumber
     and p1.MakeDate=py.DocDate and py.BalanceGroup=2 and p1.AbonentId=py.AbonentId
     where py.PaymentDate<=@Dat
     union all
     select PenaltyId,DownSum, WritingDownDate from WritingDownDebt wd join Penalty p2 on p2.Number=wd.PenaltyNumber
     and p2.MakeDate=wd.MakeDate and wd.BalanceGroup=2 and p2.AbonentId=wd.AbonentId
     where wd.PaymentDate<=@Dat) p3
     group by PenaltyId) pay
     on p.PenaltyId = pay.PenaltyId
     left join (select PenaltyId,max(PayDate) PayDate,sum(PaySum) PaySum from
     (select PenaltyId,PaySum, PayDate from Payments py join Penalty p1 on p1.Number=py.DocNumber
     and p1.MakeDate=py.DocDate and py.BalanceGroup=2 and p1.AbonentId=py.AbonentId
     where py.PaymentDate=@Dat
     union all
     select PenaltyId,DownSum, WritingDownDate from WritingDownDebt wd join Penalty p2 on p2.Number=wd.PenaltyNumber
     and p2.MakeDate=wd.MakeDate and wd.BalanceGroup=2 and p2.AbonentId=wd.AbonentId
     where wd.PaymentDate=@Dat) p3
     group by PenaltyId) payCM
     on p.PenaltyId = payCM.PenaltyId
where --isnull(pay.PaySum, 0) < isnull(ph.PwrSum, PSum) + isnull(ps.PwrSum,0) and
p.PaymentDate<=@Dat
and (0 = 0 or BranchId=0)
group by year(p.PaymentDate)
order by 1
select @Dat=DATEADD(month, -1,@Dat)
select @Datcount=@Datcount-1
end
select * from #tmpRes

Когда select @Datcount=1, то всё работает. А вот если ставлю больше 1, таким образом хочу прогнать несколько месяцев, то ошибка.
Внимание! Значение NULL исключено в агрегатных или других операциях SET.

(строк обработано: 8)
Сообщение 2714, уровень 16, состояние 6, строка 9
В базе данных уже существует объект с именем "#tmpRes".
15 ноя 11, 17:26    [11601361]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать цикл While  [new]
Glory
Member

Откуда:
Сообщений: 104751
А добавить в группировку еще месяц и посчтать все сразу одим запросом ?

Vad72
аким образом хочу прогнать несколько месяцев, то ошибка.
Внимание! Значение NULL исключено в агрегатных или других операциях SET.

Это не ошибка. Это предупрежение


Vad72
(строк обработано: 8)
Сообщение 2714, уровень 16, состояние 6, строка 9
В базе данных уже существует объект с именем "#tmpRes".

Ну так команда
select into #tmpRes
создает таблицу при первой итерации цикла
И ко второй итерации таблица уже есть

Сообщение было отредактировано: 15 ноя 11, 17:30
15 ноя 11, 17:30    [11601382]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать цикл While  [new]
Vad72
Member [заблокирован]

Откуда: KYIV
Сообщений: 4613
Vad72
(строк обработано: 8)
Сообщение 2714, уровень 16, состояние 6, строка 9
В базе данных уже существует объект с именем "#tmpRes".

Ну так команда
select into #tmpRes
создает таблицу при первой итерации цикла
И ко второй итерации таблица уже есть[/quot]
понял. А как тогда поступить?
15 ноя 11, 17:32    [11601413]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать цикл While  [new]
Vad72
Member [заблокирован]

Откуда: KYIV
Сообщений: 4613
Glory
И ко второй итерации таблица уже есть

немного не понимаю. Если уже есть, то почему не вставляет в эту таблицу.
Можно как-то создать ее вверху, типа декларе таблица .... или это не поможет?
15 ноя 11, 17:37    [11601454]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать цикл While  [new]
Glory
Member

Откуда:
Сообщений: 104751
Vad72
немного не понимаю. Если уже есть, то почему не вставляет в эту таблицу.

Потому что команда select into не добавляет данные к уже созданной таблице
Об этом в хелпе написано
15 ноя 11, 17:39    [11601469]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать цикл While  [new]
Vad72
Member [заблокирован]

Откуда: KYIV
Сообщений: 4613
Glory
Vad72
немного не понимаю. Если уже есть, то почему не вставляет в эту таблицу.

Потому что команда select into не добавляет данные к уже созданной таблице
Об этом в хелпе написано

Спасибо!
Сделал по другому, не знаю, правильно так делать или нет, но вроде бы работает.

set dateformat dmy
declare @Dat datetime
declare @Datcount integer
declare @tmpres table  (Mes Date, y int, kVt_ch int, SaldoDbt decimal(18,2), TurnCrd decimal(18,2))
select @Datcount=2
select @Dat='20111001 00:00:00.000'
while (@Datcount >= 1) 
begin
insert into @tmpres
select 
 cast(@Dat as DATE) Mes,
year(p.PaymentDate) y,
       sum(isnull(ph.PwrSum, PSum) + isnull(ps.PwrSum,0)) kVt_ch,
       sum(case when isnull(ph.PwrSum, PSum) + isnull(ps.PwrSum,0) - isnull(pay.PaySum, 0)>0
       then isnull(ph.PwrSum, PSum) + isnull(ps.PwrSum,0) - isnull(pay.PaySum, 0) else 0 end) SaldoDbt,
       isnull(sum(payCM.PaySum),0) TurnCrd        
from Penalty p join Abonent a on p.AbonentId=a.AbonentId
     left join
     (select PenaltyId, PwrSum, Pwr from PenaltyHistory ph
      where HisDate = (select max(HisDate) from PenaltyHistory ph1 where ph1.PenaltyId = ph.PenaltyId)) ph on p.PenaltyId = ph.PenaltyId
     left join (select PenaltyId, sum(PwrSum) PwrSum, sum(Pwr) Pwr from PenaltyStorno
     where PaymentDate<=@Dat
     group by PenaltyId) ps on p.PenaltyId = ps.PenaltyId
     left join (select PenaltyId,max(PayDate) PayDate,sum(PaySum) PaySum from
     (select PenaltyId,PaySum, PayDate from Payments py join Penalty p1 on p1.Number=py.DocNumber
     and p1.MakeDate=py.DocDate and py.BalanceGroup=2 and p1.AbonentId=py.AbonentId
     where py.PaymentDate<=@Dat
     union all
     select PenaltyId,DownSum, WritingDownDate from WritingDownDebt wd join Penalty p2 on p2.Number=wd.PenaltyNumber
     and p2.MakeDate=wd.MakeDate and wd.BalanceGroup=2 and p2.AbonentId=wd.AbonentId
     where wd.PaymentDate<=@Dat) p3
     group by PenaltyId) pay
     on p.PenaltyId = pay.PenaltyId
     left join (select PenaltyId,max(PayDate) PayDate,sum(PaySum) PaySum from
     (select PenaltyId,PaySum, PayDate from Payments py join Penalty p1 on p1.Number=py.DocNumber
     and p1.MakeDate=py.DocDate and py.BalanceGroup=2 and p1.AbonentId=py.AbonentId
     where py.PaymentDate=@Dat
     union all
     select PenaltyId,DownSum, WritingDownDate from WritingDownDebt wd join Penalty p2 on p2.Number=wd.PenaltyNumber
     and p2.MakeDate=wd.MakeDate and wd.BalanceGroup=2 and p2.AbonentId=wd.AbonentId
     where wd.PaymentDate=@Dat) p3
     group by PenaltyId) payCM
     on p.PenaltyId = payCM.PenaltyId
where --isnull(pay.PaySum, 0) < isnull(ph.PwrSum, PSum) + isnull(ps.PwrSum,0) and
p.PaymentDate<=@Dat
and (0 = 0 or BranchId=0)
group by year(p.PaymentDate)
order by 1
select @Dat=DATEADD(month, -1,@Dat)
select @Datcount=@Datcount-1
end
select * from @tmpRes


15 ноя 11, 17:48    [11601552]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать цикл While  [new]
Glory
Member

Откуда:
Сообщений: 104751
Vad72
Сделал по другому, не знаю, правильно так делать или нет, но вроде бы работает.

А цикл - чтобы дольше работало ?
15 ноя 11, 17:49    [11601559]     Ответить | Цитировать Сообщить модератору
 Re: Как правильно использовать цикл While  [new]
Vad72
Member [заблокирован]

Откуда: KYIV
Сообщений: 4613
Glory
Vad72
Сделал по другому, не знаю, правильно так делать или нет, но вроде бы работает.

А цикл - чтобы дольше работало ?

Просто сам запрос не я делал. Боюсь что-то "сломать".
15 ноя 11, 17:55    [11601612]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить