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

Откуда:
Сообщений: 21
Помогите с с запросом! Не могу найти ошибку!
есть dbo.staffposition в которой есть поля recid, count, jobid, financetypeid, departmentid, categoryid
так вот, при совпадении полей jobid, financetypeid, departmentid, categoryid нужно чтобы поле count суммировалось, а полю recid присваивалось одно значение. На данный момент много записей где jobid, financetypeid, departmentid, categoryid одинаковые, а строки count не суммируются и существуют под разными recid.
Есть скрипт, допустимм привязанный к одной записи

declare @recid1 int, @recid int,@jobid int,@financetypeid int,@departmentid int,@categoryid int
declare @table table(jobid int,financetypeid int,departmentid int,categoryid int)
declare cur cursor for
(select recid,jobid,financetypeid,departmentid,categoryid from staffposition where count!=0)
open cur

FETCH NEXT FROM cur
INTO @recid, @jobid, @financetypeid, @departmentid, @categoryid

WHILE @@FETCH_STATUS = 0
begin

print 'recid= '+convert(varchar,@recid)

if((select distinct 1 from @table where @jobid=jobid
and @financetypeid=financetypeid
and @departmentid=departmentid
and @categoryid=categoryid)=1)
begin
FETCH NEXT FROM cur
INTO @recid, @jobid, @financetypeid, @departmentid, @categoryid
continue
end
print '2 recid= '+convert(varchar,@recid)


insert into @table(jobid,financetypeid,departmentid,categoryid) values(@jobid, @financetypeid, @departmentid, @categoryid)
declare cur1 cursor for
select recid from staffposition
where @recid!=recid
and @jobid=jobid
and @financetypeid=financetypeid
and @departmentid=departmentid
and @categoryid=categoryid
open cur1

FETCH NEXT FROM cur1
INTO @recid1
WHILE @@FETCH_STATUS = 0
begin

print '3 recid = '+convert(varchar,@recid)+'; recid1 = '+convert(varchar,@recid1)

if(
(select distinct 1 from inctojob ij
join job j on j.recid=ij.jobid
join staffposition sp on sp.jobid=j.recid
where sp.recid=@recid1)=1
or
(select distinct 1 from staffincrease
where staffPositionID=@recid1)=1
)
begin
FETCH NEXT FROM cur1
INTO @recid1
continue
end
print 'update'

update staffposition set count = (select count from staffposition where recid = @recid) + (select count from staffposition where recid = @recid1) where recid = @recid
update staffposition set count = 0 where recid = @recid1
update employee set staffpositionid = @recid where staffpositionid = @recid1
FETCH NEXT FROM cur1
INTO @recid1
end
close cur1
deallocate cur1
FETCH NEXT FROM cur
INTO @recid, @jobid, @financetypeid, @departmentid, @categoryid
end
close cur
deallocate cur


на команды print выдает следующие значения

recid= 3172
2 recid= 3172

(1 row(s) affected)

3 recid = 3172; recid1 = 3173
3 recid = 3172; recid1 = 3173; inctojob =3173
recid= 3173

т.е. в блок update запрос не заходит. Где порылась собака? :(
Заранее спасибо за ответ!
7 сен 09, 17:39    [7628387]     Ответить | Цитировать Сообщить модератору
 Re: помогите новичку с запросом!  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Вот вместо этого:

автор
есть dbo.staffposition в которой есть поля recid, count, jobid, financetypeid, departmentid, categoryid
так вот, при совпадении полей jobid, financetypeid, departmentid, categoryid нужно чтобы поле count суммировалось, а полю recid присваивалось одно значение. На данный момент много записей где jobid, financetypeid, departmentid, categoryid одинаковые, а строки count не суммируются и существуют под разными recid.


последуйте, пожалуйста, Рекомендации по оформлению сообщений в форуме особенно пунктам 4 и 6.
7 сен 09, 17:52    [7628461]     Ответить | Цитировать Сообщить модератору
 Re: помогите новичку с запросом!  [new]
i2akai1
Member

Откуда: Петербург
Сообщений: 217
elena_78,

у меня
if(
(select distinct 1 from inctojob ij
join job j on j.recid=ij.jobid
join staffposition sp on sp.jobid=j.recid
where sp.recid=@recid1)=1
or
(select distinct 1 from staffincrease
where staffPositionID=@recid1)=1
)

всегда выдает 1 :)
что вы этим хотите проверить?
7 сен 09, 17:55    [7628469]     Ответить | Цитировать Сообщить модератору
 Re: помогите новичку с запросом!  [new]
Glory
Member

Откуда:
Сообщений: 104760
По-моему, здесь курсоры вообще не нужны. Тем более вложенные
7 сен 09, 17:56    [7628478]     Ответить | Цитировать Сообщить модератору
 Re: помогите новичку с запросом!  [new]
elena_78
Member

Откуда:
Сообщений: 21
pkarklin,
спасибо за рекомендации. Первый раз.
SQL Server 2000.
7 сен 09, 17:58    [7628483]     Ответить | Цитировать Сообщить модератору
 Re: помогите новичку с запросом!  [new]
elena_78
Member

Откуда:
Сообщений: 21
Glory, я хотела бы с этим согласиться, но есть задача исправить этот скрипт.
7 сен 09, 18:03    [7628515]     Ответить | Цитировать Сообщить модератору
 Re: помогите новичку с запросом!  [new]
Glory
Member

Откуда:
Сообщений: 104760
elena_78
Glory, я хотела бы с этим согласиться, но есть задача исправить этот скрипт.

Скрипт, который открывает два вложенных курсора по одной таблицы с обновлениями по той же таблицы , есть очень плохой скрипт.
7 сен 09, 18:08    [7628537]     Ответить | Цитировать Сообщить модератору
 Re: помогите новичку с запросом!  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
elena_78
но есть задача исправить этот скрипт.
Тот, кто Вам такую задачу поставил, он Вас подставил

Задача должна преследовать цель "добиться требуемого результата"
а не "поправить чей-то скрипт"

Выполните, пожалуйста, 6-й пункт Рекомендаций, ссылку на которые Вам дали выше
7 сен 09, 18:09    [7628540]     Ответить | Цитировать Сообщить модератору
 Re: помогите новичку с запросом!  [new]
i2akai1
Member

Откуда: Петербург
Сообщений: 217
Если не учитывать ваши условия о наличии записей в таблицах
inctojob, job, staffincrease, то у меня получилось так:

--проставляем count во всей таблице staffposition
update staffposition set
  count = sp.cnt
from staffposition 
  join ( select jobid, financetypeid, departmentid, categoryid, count(*) cnt
         from staffposition 
         group by jobid, financetypeid, departmentid, categoryid) sp
  on staffposition.jobid = sp.jobid
    and staffposition.financetypeid = sp.financetypeid
    and staffposition.departmentid = sp.departmentid
    and staffposition.categoryid = sp.categoryid

--оставляем ненулевой count только у первого recid для группы с одинаковыми
--полями jobid, financetypeid, departmentid, categoryid
update staffposition set
  count = 0
from staffposition 
  left join ( select jobid, financetypeid, departmentid, categoryid, min(recid) cnt
         from staffposition 
         group by jobid, financetypeid, departmentid, categoryid) sp
  on staffposition.recid = sp.recid
where sp.recid is null

--обновляем ссылки чтобы они указывали на записи с ненулевым count
update emploee set
  staffpositionid = sp_new.rec_id
from emploee
  join staffposition sp on emploee.staffpositionid = sp.recid
  join staffposition sp_new on sp.jobid = sp_new.jobid
    and sp.financetypeid = sp_new.financetypeid
    and sp.departmentid = sp_new.departmentid
    and sp.categoryid = sp_new.categoryid
    and sp_new.count > 0
7 сен 09, 18:36    [7628643]     Ответить | Цитировать Сообщить модератору
 Re: помогите новичку с запросом!  [new]
hawkhawk
Member

Откуда: Northern Сapital
Сообщений: 71
Добрый день.
Подскажите пожалуйста, как перебрать все таблицы базы по команде ALTER TABLE, чтобы ручками не вбивать?
Ну, скажем вот такой кусочек:
===========
USE [base1]
ALTER TABLE [dbo].[_t1] REBUILD PARTITION = ALL
WITH (DATA_COMPRESSION = PAGE)
GO
===========
Спасибо.
8 сен 09, 08:36    [7629590]     Ответить | Цитировать Сообщить модератору
 Re: помогите новичку с запросом!  [new]
DENIS_CHEL
Member

Откуда:
Сообщений: 23097
SELECT * FROM INFORMATION_SCHEMA.TABLES
начните отсюда... + почитайте про динамический sql...
8 сен 09, 08:56    [7629618]     Ответить | Цитировать Сообщить модератору
 Re: помогите новичку с запросом!  [new]
elena_78
Member

Откуда:
Сообщений: 21
i2akai1, Спасибо огромное!!! :)) с маленькими поправками - заработало!!!
8 сен 09, 11:28    [7630438]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить