2011-01-05 83 views
0

現在我的存儲過程返回2個不同的結果做一個設定爲@booked,另一個用於@ booked1存儲過程的問題,與我的where子句和if語句

,如果你仔細看我的查詢正在進行每個@booked和@booked都是一樣的,但一個是用戶選擇年份,另一個是當年。

我不想要兩個不同的結果集,我想參加所選年度和本年度並排通過SDESCR(這是他們所共有的一列)我面臨

另一個障礙是我用@模式來決定用戶是否想要netsales,銷售......等等。

我知道我需要sometype。這時候的加入,但它不是工作,因爲我有一個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 
+0

我的主要建議是:讓這個分開存儲的特效,每一個「模式」 - 唐't包裝所有這些不同的選擇到一個單獨的存儲過程... – 2011-01-05 16:12:11

+0

我有一些麻煩理解爲什麼分配@booked與SELECT CONVERT(int,DateAdd(year,@YearToGet - Year(getdate()+ 1)) DateAdd(day,DateDiff(day,1,getdate()),1)))。如果我選擇2011作爲@YearToGet,則結果是40546.這是您的預期結果嗎?還是應該是一年? – Lamak 2011-01-05 16:19:38

+0

是啊誰開發我們的數據庫的人想要使生活艱難,並使用整數作爲日期 – MyHeadHurts 2011-01-05 16:25:58

回答

2

一個簡單的方法,通過側面結果有一側是使用側的子查詢從

注意:這僅僅是模式=銷售

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語句上的每個字段

+0

這將工作,即使與if語句,或做cte不工作if語句 – MyHeadHurts 2011-01-05 16:23:47

+0

如果這項工作,我會跳躍的喜悅 – MyHeadHurts 2011-01-05 16:24:56

+0

Ms 1033,Level 15,狀態1,過程test1,行61 除非還指定了TOP或FOR XML,否則ORDER BY子句在視圖,內聯函數,派生表,子查詢和公用表表達式中無效。 Msg 102,Level 15,State 1,Procedure test1,Line 74 'b1'附近語法不正確。 – MyHeadHurts 2011-01-05 16:37:07