为什么我的if语句不能在我的存储过程中工作

时间:2010-12-30 20:38:39

标签: sql sql-server-2005 stored-procedures

好吧所以我甚至不确定这是否可行 我有一个q_00和q_01和q_02都在我的存储过程中。 然后在底部我有3个选择语句 选择某个类别,例如销售,净销售和INS销售

我想要做的是,如果用户键入exec(我的sp的名称)(销售)(以及一年是@yearparameter),它将运行sales select语句

如果他们输入Exec(我的SP的名称)netsales(@Yeartoget),它将显示净销售是否可能或我是否需要多个存储过程

   ALTER PROCEDURE [dbo].[casof]
 @YearToGet int,
 @mode VARCHAR(20)
 as
;
with
q_00 as (
select
      DIVISION
    , SDESCR
    , DYYYY
    , sum(APRICE)        as asofSales 
    , sum(PARTY)         as asofPAX        
    , sum(NetAmount)     as asofNetSales        
    , sum(InsAmount)     as asofInsSales        
    , sum(CancelRevenue) as asofCXSales        
    , sum(OtherAmount)   as asofOtherSales        
    , sum(CXVALUE)       as asofCXValue  
from dbo.B101BookingsDetails 
where Booked <= CONVERT(int,DateAdd(year, @YearToGet - Year(getdate()), DateAdd(day, DateDiff(day, 1, getdate()), 0)))
  and DYYYY = @YearToGet
group by DIVISION, SDESCR, DYYYY 
),
q_01 as (
select     
      DIVISION 
    , SDESCR
    , DYYYY 
    , sum(APRICE)        as YESales 
    , sum(PARTY)         as YEPAX 
    , sum(NetAmount)     as YENetSales
    , sum(InsAmount)     as YEInsSales 
    , sum(CancelRevenue) as YECXSales 
    , sum(OtherAmount)   as YEOtherSales
    , sum(CXVALUE)       as YECXValue
from  dbo.B101BookingsDetails 
where DYYYY=@YearToGet
group by DIVISION, SDESCR, DYYYY 
),
q_02 as (
select
      DIVISION
    , SDESCR
    , DYYYY
    , sum(APRICE)        as CurrentSales 
    , sum(PARTY)         as CurrentPAX        
    , sum(NetAmount)     as CurrentNetSales        
    , sum(InsAmount)     as CurrentInsSales        
    , sum(CancelRevenue) as CurrentCXSales        
    , sum(OtherAmount)   as CurrentOtherSales        
    , sum(CXVALUE)       as CurrentCXValue  
from dbo.B101BookingsDetails 
where Booked <= CONVERT(int,DateAdd(year, (year( getdate() )) - Year(getdate()), DateAdd(day, DateDiff(day, 1, getdate()), 0)))
  and DYYYY = (year( getdate() ))
group by DIVISION, SDESCR, DYYYY 
)

IF @mode = 'sales'
select
      a.DIVISION 
    , a.SDESCR
    , a.DYYYY
    , asofSales 
    , asofPAX        
    , YESales 
    , YEPAX 
    , CurrentSales 
    , CurrentPAX 
    , asofsales/ ISNULL(NULLIF(yesales,0),1) as percentsales
    , asofpax/yepax as percentpax
    ,currentsales/ISNULL(NULLIF((asofsales/ISNULL(NULLIF(yesales,0),1)),0),1) as projectedsales
    ,currentpax/ISNULL(NULLIF((asofpax/ISNULL(NULLIF(yepax,0),1)),0),1) as projectedpax
from q_00 as a
join q_01 as b on (b.DIVISION = a.DIVISION and b.SDESCR = a.SDESCR and b.DYYYY = a.DYYYY) 
join q_02 as c on (b.DIVISION = c.DIVISION and b.SDESCR = c.SDESCR)
order by a.DIVISION, a.SDESCR, a.DYYYY ;


else if @mode= 'netsales'

select
      a.DIVISION 
    , a.SDESCR
    , a.DYYYY
    , asofPAX        
    , asofNetSales        
    , YEPAX 
    , YENetSales
    , CurrentPAX 
    , CurrentNetSales
    , asofnetsales/ ISNULL(NULLIF(yenetsales,0),1) as percentnetsales
    , asofpax/yepax as percentpax


,currentnetsales/ISNULL(NULLIF((asofnetsales/ISNULL(NULLIF(yenetsales,0),1)),0),1) as projectednetsales
,currentpax/ISNULL(NULLIF((asofpax/ISNULL(NULLIF(yepax,0),1)),0),1) as projectedpax

from q_00 as a
join q_01 as b on (b.DIVISION = a.DIVISION and b.SDESCR = a.SDESCR and b.DYYYY = a.DYYYY) 
join q_02 as c on (b.DIVISION = c.DIVISION and b.SDESCR = c.SDESCR)
order by a.DIVISION, a.SDESCR, a.DYYYY ;

 ELSE IF @mode = 'inssales'

select
      a.DIVISION 
    , a.SDESCR
    , a.DYYYY
    , asofPAX     
    , asofInsSales        
    , YEPAX 
    , YEInsSales 
    , CurrentPAX 
    , CurrentInsSales 
    , asofinssales/ ISNULL(NULLIF(yeinssales,0),1) as percentsales
    , asofpax/yepax as percentpax
    ,currentinssales/ISNULL(NULLIF((asofinssales/ISNULL(NULLIF(yeinssales,0),1)),0),1) as projectedinssales

from q_00 as a
join q_01 as b on (b.DIVISION = a.DIVISION and b.SDESCR = a.SDESCR and b.DYYYY = a.DYYYY) 
join q_02 as c on (b.DIVISION = c.DIVISION and b.SDESCR = c.SDESCR)
order by a.DIVISION, a.SDESCR, a.DYYYY ;

2 个答案:

答案 0 :(得分:3)

只需添加另一个名为@mode的参数,然后使用if @mode='sales'执行条件逻辑。

在您更新之后,我很想创建两个辅助参数化内嵌TVF。

CREATE FUNCTION dbo.AggregateBookingDetails  
(   
    @Booked datetime, 
    @YearToGet int
)
RETURNS TABLE 
AS
RETURN 
(
select
      DIVISION
    , SDESCR
    , DYYYY
    , sum(APRICE)        as Sales 
    , sum(PARTY)         as PAX        
    , sum(NetAmount)     as NetSales        
    , sum(InsAmount)     as InsSales        
    , sum(CancelRevenue) as CXSales        
    , sum(OtherAmount)   as OtherSales        
    , sum(CXVALUE)       as CXValue  
from dbo.B101BookingsDetails 
where @Booked IS NULL OR Booked <= @Booked
  and DYYYY = @YearToGet
group by DIVISION, SDESCR, DYYYY 
)

GO

CREATE FUNCTION fn_casof
(   
    @YearToGet int
)
RETURNS TABLE 
AS
RETURN 
(
select       
      a.DIVISION
    , a.SDESCR
    , a.DYYYY
    , a.Sales as a_Sales
    , b.Sales as b_Sales
    , c.Sales as c_Sales
    , .... /*etc. etc*/
from dbo.AggregateBookingDetails(CONVERT(int,DateAdd(year, @YearToGet - Year(getdate()), DateAdd(day, DateDiff(day, 1, getdate()), 0))), @YearToGet) as a
join dbo.AggregateBookingDetails(NULL, @YearToGet) as b on (b.DIVISION = a.DIVISION and b.SDESCR = a.SDESCR and b.DYYYY = a.DYYYY) 
join dbo.AggregateBookingDetails(CONVERT(int,DateAdd(year, (year( getdate() )) - Year(getdate()), DateAdd(day, DateDiff(day, 1, getdate()), 0))), year( getdate() )) as c on (b.DIVISION = c.DIVISION and b.SDESCR = c.SDESCR)
)

您的存储过程条件逻辑只需要从第二个TVF中选择所需的列。

ALTER PROCEDURE [dbo].[casof]
@YearToGet int,
@mode VARCHAR(20)
as
IF (@mode='sales')
SELECT collist1 FROM dbo.fn_casof(@yeartoget)
ELSE
    IF (@mode='netsales')
    SELECT collist2 FROM dbo.fn_casof(@yeartoget)
    ELSE
    SELECT collist3 FROM dbo.fn_casof(@yeartoget)

答案 1 :(得分:0)

不确定这是不是你问的问题,但是:

CREATE PROCEDURE prcSelector @query VARCHAR(20), @yeartoget INT
AS
        IF @query = 'sales'
                SELECT  @yeartoget
        ELSE IF @query = 'netsales'
                SELECT  'netsales'
        ELSE IF @query = 'other'
                SELECT  'other'

用您的查询替换SELECT语句。