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

Откуда:
Сообщений: 87
Я имею две таблички
        /*  таблица 1*/
        CREATE TABLE [g_office] (
	[Id] [int] IDENTITY (1, 1) NOT NULL ,
	[OfficeName] [varchar] (255) COLLATE Cyrillic_General_CI_AS NULL ,
	[Active] [int] NOT NULL CONSTRAINT [DF_g_office_Active] DEFAULT (1),
	CONSTRAINT [PK_g_office] PRIMARY KEY  CLUSTERED 
	(
		[Id]
	)  ON [PRIMARY] 
	) ON [PRIMARY]
	GO
        /*  таблица 2*/
       CREATE TABLE [g_staff] (
	[Id] [int] IDENTITY (1, 1) NOT NULL ,
	[StaffName] [varchar] (255) COLLATE Cyrillic_General_CI_AS NULL ,
	[ScheduleId] [int] NOT NULL CONSTRAINT [DF_g_staff_ScheduleId] DEFAULT (0),
	[OfficeId] [int] NOT NULL CONSTRAINT [DF_g_staff_officeId] DEFAULT (0),
	[Active] [int] NOT NULL CONSTRAINT [DF_g_staff_Active] DEFAULT (0),
	CONSTRAINT [PK_g_staff] PRIMARY KEY  CLUSTERED 
	(
		[Id]
	)  ON [PRIMARY] 
    ) ON [PRIMARY]
   GO

             /* вставка */
             insert g_office (OfficeName) values ('Офис1') 
	insert g_office (OfficeName) values ('Офис2') 

	insert g_staff (StaffName, OfficeId, active) values ('Специалист 1', '1', '1') 
	insert g_staff (StaffName, OfficeId, active) values ('Специалист 2', '2', '1') 
	
	insert g_staff (StaffName, OfficeId, active) values ('Специалист 3', '1', '1') 
	insert g_staff (StaffName, OfficeId, active) values ('Специалист 4', '1', '1') 


Результат обработки должен быть следующим, необходимо сложить две таблицы и получить одну общую вида следующего:

1	Офис1	                      Офис2
5 8{Id}Специалист 1 9{Id}Специалист 2
6 10{Id}Специалист 3 NULL
7 11{Id}Специалист 4 NULL


Я написал хранимую, но, на мой взгляд, можно было сделать все проще, подскажите как! И еще одна проблема в этой хранимой, что если увеличиваются количество офисов, то необходимо вносить изменения в таблицу #tmpCell :(

сама процедура:
if( object_id( 'tempdb..#tmpCell' ) is not null ) drop table #tmpCell
	create table #tmpCell (Id int identity (1, 1) not null, out1 varchar(255) default NULL, out2 varchar(255) default NULL)
	
	if( object_id( 'tempdb..#tmpStaff' ) is not null ) drop table #tmpStaff
	create table #tmpStaff (Id int identity (1, 1) not null, outs varchar(255) default NULL, sid int)

	declare @sql varchar(525), @Id int, @i int, @name_off varchar(255), @s int, @s2 int, @smax int, @staffName varchar(255)
	
	set @i=0
	set @sql = ''
	select @smax = count(*) from g_staff staff
			inner join g_office office on office.Id=staff.officeId
			where staff.active='1' and staff.active='1'  
	
	declare COf cursor fast_forward for select Id, officename from g_office office where active=1
	 open COf
	   while 1 = 1 begin
	      fetch next from COf into @Id, @name_off
		  if @@fetch_status <> 0 break

			set @s = NULL
			set @i = @i+1

			if(@i=1) 
			 begin	
			  	set @sql = 'insert #tmpCell (out'+convert(varchar,@i)+') values ('''+rtrim(ltrim(@name_off))+''')'
			 	exec(@sql)

				set @s2 = 1
				while (@s2<=@smax)
                                 begin
					 set @s2  =@s2+1
					 insert #tmpCell (out1,out2) values (NULL, NULL)
				 end
		
			 end
			else
			 begin
				set @sql = 'update #tmpCell set out'+convert(varchar,@i)+'='''+rtrim(ltrim(@name_off))+''' where Id=1'
				exec(@sql)
			 end
			

			----- update #tmpCell
			
			insert #tmpStaff (outs,sid)
			  select rtrim(ltrim(convert(varchar,id)+'{Id}'+staffName)), @Id  from g_staff where active=1 and officeId=@Id	
			
			select @s = count(*) from g_staff where active=1 and officeId=@Id
			set @s2 = 1
			
			while (@s2<=@s) 
                         begin

				set @s2 = @s2+1				
			    	set @sql = 'update #tmpCell set out'+convert(varchar,@i)+'='''+convert(varchar,@Id)+'-'+convert(varchar,@s2)+''' where Id<>1 and Id='+convert(varchar,@s2)
				exec(@sql)
		
			 end
			
			
		    end
	      close COf
	deallocate COf
	
	delete #tmpCell where out1 is null and out2 is null 	
	
	set @i=1

	declare @ntb varchar(255), @flt int	
	declare sCur cursor fast_forward for select outs, sid from #tmpStaff

	open sCur
	 fetch next from sCur into @staffName, @id  
	 while @@Fetch_Status = 0
	    begin
	      set @i = @i+1
	      if(@flt<>@id) set @i=2 	
	      set @ntb = rtrim(ltrim(convert(varchar,@id)+'-'+convert(varchar,@i))) 
	      set @sql = 'update #tmpCell set out'+convert(varchar,@id)+'='''+rtrim(ltrim(@staffName))+''' where out'+convert(varchar,@id)+'='''+@ntb+'''' 		
	      exec(@sql)
	      set @flt = @id 
	     fetch next from sCur into @staffName, @id  
	    end
	 close sCur
	deallocate sCur

	/* result */
	select * from #tmpCell 

Спасибо
14 сен 09, 12:40    [7654684]     Ответить | Цитировать Сообщить модератору
 Re: Как можно упростить запрос, просьба помогите  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
Топ 10 вопросов, вопрос 10.
14 сен 09, 12:44    [7654726]     Ответить | Цитировать Сообщить модератору
 Re: Как можно упростить запрос, просьба помогите  [new]
Dimonchik
Member

Откуда:
Сообщений: 87
Спасибо
14 сен 09, 13:41    [7655187]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить