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

Откуда: Норильск
Сообщений: 936
есть такой запрос:
declare @i int
set @i=1
while @i <= 2
begin
select name_pred+' - всего' as predpr, sum(pr_rab) as 'ФЗП'
from structur_otiz, pred, vopl where structur_otiz.kvo=vopl.shifr
and pred.shifr_pred=structur_otiz.predpr and (vopl.grv='ФЗП') and shifr_pred = '601' and mes = @i and god = '2004' and group by name_pred order by predpr
set @i=@i+1
end
возвращает 2 запроса:

predpr          'ФЗП' 
ТЭР - 1 - всего	13022.626580

predpr          'ФЗП' 
ТЭР - 1 - всего	12735.853840

как мне теперь сложить поле ФЗП, первое поле predpr оставить без изменений, и в результате получить один запрос

predpr          'ФЗП' 
ТЭР - 1 - всего	25758.47

заранее спасибо.
22 июл 05, 09:40    [1726443]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
select name_pred+' - всего' as predpr, sum(pr_rab) as 'ФЗП'
from structur_otiz, pred, vopl where structur_otiz.kvo=vopl.shifr 
and pred.shifr_pred=structur_otiz.predpr and (vopl.grv='ФЗП') and shifr_pred = '601' and mes IN (1, 2) and god = '2004' and group by name_pred order by predpr
22 июл 05, 09:42    [1726454]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 936
нет, мне именно надо циклом. там просто еще другие параметры, я кратко запрос привела.
22 июл 05, 09:45    [1726467]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Настенька
нет, мне именно надо циклом. там просто еще другие параметры, я кратко запрос привела.
Создать ещё одну локальную переменную, инициировать её нулем и присваивать ей значение sum(pr_rab) +<сама локальная переменная>.
22 июл 05, 09:50    [1726486]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
MichaelGK
Member

Откуда: Москва
Сообщений: 311
Вариант: в каждом шаге цикла результат складывать во временную таблицу, а заключительным селектом сгруппировать как вам нужно.
22 июл 05, 09:52    [1726498]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 936
мне надо без временных таблиц. а какие еще варианты есть?
22 июл 05, 09:57    [1726515]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Настенька
мне надо без временных таблиц. а какие еще варианты есть?
Есть табличные переменные.
22 июл 05, 10:04    [1726536]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 936
а можно на примере моего запроса рассказать про табличные переменные.
22 июл 05, 10:05    [1726541]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
Настенька
select name_pred+' - всего' as predpr, sum(pr_rab) as 'ФЗП'
from structur_otiz, pred, vopl where structur_otiz.kvo=vopl.shifr
and pred.shifr_pred=structur_otiz.predpr and (vopl.grv='ФЗП') and shifr_pred = '601' and mes = @i and god = '2004' and group by name_pred order by predpr

Интересно как этот селект с group by name_pred может вернуть больше одной записи "ТЭР - 1"? Разве что приведён не полностью.
22 июл 05, 10:11    [1726558]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 936
да, он приведен не полностью. суть не в этом. как сделать так, что после сформирования цикла он выводил не 2 запроса, а один, и там будет уже сложенное поле ФЗП.
22 июл 05, 10:15    [1726564]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Настенька
а можно на примере моего запроса рассказать про табличные переменные.

declare @t table(name_pred nvarchar(50), [ФЗП] decimal(20, 10))

declare @i int
set @i=1
while @i <= 2
begin
insert @t
select name_pred+' - всего' as predpr, sum(pr_rab) as 'ФЗП'
from structur_otiz, pred, vopl where structur_otiz.kvo=vopl.shifr 
and pred.shifr_pred=structur_otiz.predpr and (vopl.grv='ФЗП') and shifr_pred = '601' and mes = @i and god = '2004' group by name_pred order by predpr
set @i=@i+1
end

select name_pred,
	sum([ФЗП])
	from @t
	group by name_pred
22 июл 05, 10:17    [1726569]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
Настенька
да, он приведен не полностью. суть не в этом. как сделать так, что после сформирования цикла он выводил не 2 запроса, а один, и там будет уже сложенное поле ФЗП.

Напишите в цикле два разных запроса. Второй выводите только когда @i=2 и только с group by name_pred
22 июл 05, 10:20    [1726575]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 936
нет, это не подходит, т.к. там i может быть любой, не обязательно 2. я заранее не знаю, какой она будет.
22 июл 05, 10:22    [1726586]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
Настенька
нет, это не подходит, т.к. там i может быть любой, не обязательно 2. я заранее не знаю, какой она будет.

Так Вам что нужно все сложить - сколько есть? Если да то сделайте это до или после цикла или в цикле когда @i=1
22 июл 05, 10:26    [1726606]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 936
не очень понятно, как это сделать. надо, чтобы вы на моем запросе показали.
22 июл 05, 10:33    [1726651]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
У Вас написанно:
...
возвращает 2 запроса:

predpr          'ФЗП' 
ТЭР - 1 - всего	13022.626580


predpr          'ФЗП' 
ТЭР - 1 - всего	12735.853840


как мне теперь сложить поле ФЗП, первое поле predpr оставить без изменений, и в результате получить один запрос

predpr          'ФЗП' 
ТЭР - 1 - всего	25758.47

Первые два результата (или N) тоже должны быть?
Или результат всего цикла - только один последний запрос?
22 июл 05, 10:39    [1726676]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
Настенька
Member

Откуда: Норильск
Сообщений: 936
нет, результат - сложение всех N. через табличну переменную всё получилось. спасибо.
22 июл 05, 10:51    [1726757]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
ChA
Member

Откуда: Москва
Сообщений: 11125
Настенька
через табличну переменную всё получилось.
А ведь это тоже временная таблица, только замаскированная :)
22 июл 05, 13:49    [1727829]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
Rustygold
Member

Откуда: СПб
Сообщений: 179
Настён, тута можно кубами воспользоваться.
Вот пример, правда на pub
USE pubs
SELECT top 4 pub_name, title, SUM(qty) AS 'qty' 
FROM sales INNER JOIN titles 
   ON sales.title_id = titles.title_id INNER JOIN publishers 
   ON publishers.pub_id = titles.pub_id
GROUP BY pub_name, title
WITH CUBE
order by qty desc
top 1 - покажет общую сумму
24 июл 05, 12:15    [1730674]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
Rustygold
Member

Откуда: СПб
Сообщений: 179
Перечитал и нашел еще более короткое решение - модификация tpg:

select name_pred+' - всего' as predpr, sum(pr_rab) as 'ФЗП'
from structur_otiz, pred, vopl where structur_otiz.kvo=vopl.shifr 
and pred.shifr_pred=structur_otiz.predpr and (vopl.grv='ФЗП') and shifr_pred = '601' and 
mes >= 1 and mes <= 2
and god = '2004' and group by name_pred order by predpr

если цикл от 1 до 10, то
mes >= 1 and mes <= 10
24 июл 05, 12:30    [1730682]     Ответить | Цитировать Сообщить модератору
 Re: Цикл while и сложение полей  [new]
Rustygold
Member

Откуда: СПб
Сообщений: 179
Настенька
нет, мне именно надо циклом. там просто еще другие параметры, я кратко запрос привела.


а если в цикле, то только через временную переменную, обычную типа single.
24 июл 05, 12:36    [1730684]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить