【问题标题】:stored procedure issue, has to do with my where clause and if statement存储过程问题,与我的 where 子句和 if 语句有关
【发布时间】:2011-01-05 15:39:24
【问题描述】:

现在我的存储过程正在返回 2 个不同的结果集,一个用于 @booked,另一个用于 @booked1

如果您仔细观察,我的查询对每个 @booked 和 @booked 执行相同的操作,但一个是针对用户选择的年份,另一个针对当前年份。

我不想要两个不同的结果集,我想通过 SDESC(这是他们共同的一列)并排加入选定的年份和当前年份

我面临的另一个障碍是我使用@mode 来决定用户是否想要网络销售、销售......等等。

我知道我需要某种类型的加入,但是它不起作用,因为我有一个 where 语句,说明 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 

【问题讨论】:

  • 我的主要建议:制作这个单独的存储过程,每个“模式”一个 - 不要将所有这些不同的选择打包到一个存储过程中......
  • 我很难理解为什么用 SELECT CONVERT(int,DateAdd(year, @YearToGet - Year(getdate() + 1), DateAdd(day, DateDiff(day, 1) 分配 @booked , getdate()), 1) ) )。如果我选择 2011 作为@YearToGet,则结果为 40546。这是您的预期结果吗?还是应该是一年?
  • 是的,开发我们数据库的人想让生活变得艰难,并使用整数作为日期

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


【解决方案1】:

获得并排结果的一种简单方法是在 From 中使用子查询

注意:这仅适用于模式 = 销售

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 语句

【讨论】:

  • @MyHeadHurts。实际上,这不是 CTE,而是标准 SQL 子查询。 CTE 实际上会让它变得更容易。
  • @MyHeadHurts。好的,我更新了按问题排序的答案
  • @MyHeadHurts 我错过了 B1 上与 B 不同的字段别名
  • 可能希望为重复的字段名称提供不同的别名。
  • @MyHeadHurts 很高兴能帮上忙。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
相关资源
最近更新 更多