проблема хранимой процедуры, имеет отношение к моему предложению where и if - PullRequest
0 голосов
/ 05 января 2011

прямо сейчас моя хранимая процедура возвращает 2 разных набора результатов, один для @booked, а другой для @ booked1

Если вы посмотрите внимательно, мой запрос выполняет одно и то же для каждого @booked и @booked, но один для выбранного пользователем года, а другой для текущего года.

Я не хочу двух разных наборов результатов, я хочу объединить выбранный год и текущий год рядом с SDESCR (это общий столбец)

Еще одно препятствие, с которым я сталкиваюсь, заключается в том, что я использую @mode, чтобы решить, хочет ли пользователь продаж, продаж ... и так далее.

Я знаю, что мне нужен какой-то тип соединения, но оно не работает, потому что у меня есть оператор where, который говорит, где dyyyy = @ yeartoget

, который не позволяет работать с данными текущего года

ALTER PROCEDURE [dbo].[test1]
@mode varchar(20),
@YearToGet int



AS
SET NOCOUNT ON

Declare @Booked Int
Set @Booked = CONVERT(int,DateAdd(year, @YearToGet - Year(getdate() + 1),                   
                DateAdd(day, DateDiff(day, 1, getdate()), 1) ) )

Declare @Booked1 Int
Set @Booked1 = CONVERT(int,DateAdd(year,  (year( getdate() )) - Year(getdate() + 1),                   
                DateAdd(day, DateDiff(day, 1, getdate()), 1) ) )


 If @mode = 'Sales'
      Select
           Division,
           SDESCR,
           DYYYY,

       Sum(Case When Booked <= @Booked Then NetAmount End) ASofNetSales,        
       SUM(NetAmount) AS YENetSales,

       Sum(Case When Booked <= @Booked Then PARTY End) AS ASofPAX,        
       SUM(PARTY) AS YEPAX


      From   dbo.B101BookingsDetails
      Where  DYYYY = @YearToGet
      Group By SDESCR, DYYYY, Division           
      Order By Division, SDESCR, DYYYY

else if @mode = 'netsales'

Select Division, 
       SDESCR,        
       DYYYY,  


       Sum(Case When Booked <= @Booked Then NetAmount End) ASofNetSales,        
       SUM(NetAmount) AS YENetSales,

       Sum(Case When Booked <= @Booked Then PARTY End) AS ASofPAX,        
       SUM(PARTY) AS YEPAX


From   dbo.B101BookingsDetails 
Where  DYYYY = @YearToGet
Group By SDESCR, DYYYY, Division
Order By Division, SDESCR, DYYYY 


If @mode = 'Sales'
      Select
           Division,
           SDESCR,
           DYYYY,

       Sum(Case When Booked <= @Booked1 Then NetAmount End) currentNetSales,       
       Sum(Case When Booked <= @Booked1 Then PARTY End) AS currentPAX        



      From   dbo.B101BookingsDetails
      Where  DYYYY = (year( getdate() ))
      Group By SDESCR, DYYYY, Division           
      Order By Division, SDESCR, DYYYY

else if @mode = 'netsales'

Select Division, 
       SDESCR,        
       DYYYY,  


       Sum(Case When Booked <= @Booked1 Then NetAmount End) currentNetSales,        


       Sum(Case When Booked <= @Booked1 Then PARTY End) AS currentPAX      



From   dbo.B101BookingsDetails 
Where  DYYYY = (year( getdate() ))
Group By SDESCR, DYYYY, Division
Order By Division, SDESCR, DYYYY 

Else if @mode = 'Inssales'

Select Division, 
       SDESCR,        
       DYYYY,  

       Sum(Case When Booked <= @Booked1 Then InsAmount End) currentInsSales,        

       Sum(Case When Booked <= @Booked1 Then PARTY End) AS currentPAX        

From   dbo.B101BookingsDetails 
Where  DYYYY = (year( getdate() ))
Group By SDESCR, DYYYY, Division
Order By Division, SDESCR, DYYYY 

1 Ответ

2 голосов
/ 05 января 2011

Один простой способ получить побочные результаты - использовать подзапросы в поле От

Примечание: это только для режима = Продажи

SELECT
           b.Division,
           b.SDESCR,
           b.DYYYY,
           b.YENetSales,
           b.YEPAX
           b1.Division,
           b1.SDESCR,
           b1.DYYYY,
           b1.currentNetSales,
           b1.currentPAX     

FROM
(Select
       Division,
       SDESCR,
       DYYYY,

   Sum(Case When Booked <= @Booked Then NetAmount End) ASofNetSales,        
   SUM(NetAmount) AS YENetSales,

   Sum(Case When Booked <= @Booked Then PARTY End) AS ASofPAX,        
   SUM(PARTY) AS YEPAX


  From   dbo.B101BookingsDetails
  Where  DYYYY = @YearToGet
  Group By SDESCR, DYYYY, Division         
) b

  FULL OUTER JOIN 
  (
Select
       Division,
       SDESCR,
       DYYYY,

   Sum(Case When Booked <= @Booked1 Then NetAmount End) currentNetSales,       
   Sum(Case When Booked <= @Booked1 Then PARTY End) AS currentPAX     
  From   dbo.B101BookingsDetails
  Where  DYYYY = (year( getdate() ))
  Group By SDESCR, DYYYY, Division  ) b1
  ON b.divsion = b1.divsion
     and
     b.SDESCR = b1.SDESCR   --might not be required

 Order By b.Division, b.SDESCR, b.DYYYY

Другой подходсостоит в том, чтобы изменить условие where, чтобы оно включало @booked и @ booked1, а затем сделать оператор case для каждого поля

...