2011-01-05 84 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