Переписать процедуру

Len4ick
Дата: 01.02.2013 11:06:14
У меня есть процедура, работает как надо. Но появилась острая необходимость переделать запрос без использования процедуры.
Я привела схему запроса в процедуре, где названия таблиц и условия WHERE условные.
Подскажите как это лучше реализвать. Tab1, Tab2, Tab3 между собой не связаны.

CREATE PROCEDURE Itog
	 @DateBegin		DateTime
	,@DateEnd		DateTime
	
AS BEGIN
SELECT * INTO #viborca1
FROM Tab1	
WHERE poleB >= @@DateBegin and poleE <  @@DateEnd 
  
SELECT * INTO #viborca2
FROM Tab2 
WHERE poleB >= @DateBegin and poleE <  @DateEnd 
  
SELECT * INTO #viborca3 FROM Tab3

SELECT distinct(City) as City
INTO #City  FROM #viborca1
UNION
SELECT distinct(City) FROM #viborca2
UNION
SELECT distinct(City) FROM #viborca3

CREATE TABLE #Itog
	(
	 City Varchar(25),
	 Pole1 Int,
	 Pole2 Int,
	 Pole3 Int,
	 Pole4 Int,
	 Pole5 Int,
	 Pole6 Int,
	 Pole7 Int,
	 Pole8 Int,		
	 )
  
INSERT #Itog
SELECT City,0,0,0,0,0,0,0,0
FROM #City

UPDATE  #Itog
SET Pole1 = (SELECT Sum(Money) FROM #viborca1 WHERE pole12 < 3),
    Pole2 = (SELECT Count(distinct pole13) FROM #viborca1 WHERE pole12 < 3)
    
UPDATE  #Itog
SET Pole3 = (SELECT Sum(Money) FROM #viborca2 WHERE pole12 > 5),
    Pole4 = (SELECT Count(distinct pole13) FROM #viborca2 WHERE pole12 > 5)
    
UPDATE  #Itog
SET Pole5 = (SELECT Sum(Money) FROM #viborca3 WHERE pole12 = 10),
    Pole6 = (SELECT Count(distinct pole13) FROM #viborca3 WHERE pole12 = 10)
  
SELECT *  INTO #Rezervl2
FROM #viborca1 WHERE pole7 = 12

UPDATE  #Itog
SET Pole1 = Pole1 + (SELECT Sum(Summa) FROM #Rezervl2 WHERE pole4 = 'END'),
    Pole2 = Pole2 + (SELECT Count(distinct pole15)FROM #Rezervl2 WHERE pole4 = 'END')
 

SELECT * INTO #Rezervl1
FROM #viborca1
WHERE pole17 = 756376
  
UPDATE  #Itog
SET Pole7 = (SELECT Sum(Summa) FROM #Rezervl1 WHERE pole24 = 'Cancel'),
    Pole8 = (SELECT Count(distinct pole13) FROM #Rezervl1 WHERE pole24 = 'Cancel')
    
 SELECT * INTO #Rezervl4
 FROM #viborca1
 WHERE pole24 = 383635
 
 UPDATE  #Itog
 SET Pole7 = Pole7 + (SELECT Sum(Summa) FROM #Rezervl4 WHERE pole14 = 'development'),
     Pole8 = Pole8 + (SELECT Count(distinct pole13) FROM #Rezervl4 WHERE pole14 = 'development')

SELECT  #Itog.* 
FROM 	#Itog 
  
END
_ч_
Дата: 01.02.2013 11:27:10
Как-то так:

insert into #Itog
select City, (SELECT Sum(Money) FROM Tab1 WHERE poleB >= @DateBegin and poleE < @DateEnd and pole12 < 3) as Pole1, (SELECT Count(distinct pole13) FROM #viborca1 WHERE poleB >= @DateBegin and poleE < @DateEnd and  pole12 < 3) as Pole2, ... from Tab1
WHERE poleB >= @DateBegin and poleE < @DateEnd
union
select distinct City, (SELECT Sum(Money) FROM Tab1 WHERE poleB >= @DateBegin and poleE < @DateEnd and pole12 < 3) as Pole1, (SELECT Count(distinct pole13) FROM #viborca1 WHERE poleB >= @DateBegin and poleE < @DateEnd and  pole12 < 3) as Pole2, ... from Tab2
WHERE poleB >= @DateBegin and poleE <  @DateEnd 
union
select distinct City, (SELECT Sum(Money) FROM Tab1 WHERE poleB >= @DateBegin and poleE < @DateEnd and pole12 < 3) as Pole1, (SELECT Count(distinct pole13) FROM #viborca1 WHERE poleB >= @DateBegin and poleE < @DateEnd and  pole12 < 3) as Pole2, ... from Tab3
WHERE poleB >= @DateBegin and poleE <  @DateEnd 
Cygapb-007
Дата: 01.02.2013 12:05:29
Len4ick
У меня есть процедура, работает как надо. Но появилась острая необходимость переделать запрос без использования процедуры.
CREATE PROCEDURE Itog
	 @DateBegin		DateTime
	,@DateEnd		DateTime
	
AS BEGIN
...
переделывается на:
--CREATE PROCEDURE Itog
declare
	 @DateBegin		DateTime
	,@DateEnd		DateTime
	
--AS 
select @DateBegin='20120101', @DateEnd='20121231' -- или нужные значения
BEGIN
...
Остальное не меняется
Если же надо оптимизировать запрос, тогда см. ответ выше :)
Len4ick
Дата: 01.02.2013 12:12:09
Всем спасибо, очень помогли