2016-09-24 40 views
0

我有一个工作程序来显示给定范围的期间的报告。 以下PROC认定为给定时间段的所有预订,并显示每个月份组有条件当使用分组时

enter image description here

CREATE PROCEDURE [dbo].[GetSummaryOverviewReport] (
    @StartDate SMALLDATETIME = NULL 
    ,@EndDate SMALLDATETIME = NULL 
    ,@IncludeVAT BIT = 0 
    ,@AddedAfter SMALLDATETIME 
    ,@HasObservation BIT = 0 
    ,@IncludeCancelledBooking BIT = 0 
    ) 
AS 
BEGIN 
    SET NOCOUNT ON 

    BEGIN 
     SELECT YEAR(StartTime) [Year] 
      ,MONTH(StartTime) [Month] 
      ,COUNT(BookingId) [BookingCount] 
      ,SUM(CASE 
        WHEN IsVAT = 1 
         AND @IncludeVAT = 1 
         THEN (Price/100) * 80 
        ELSE Price 
        END) AS TotalPrice 
      ,PaidCount = sum(CASE 
        WHEN B.PaymentStatus = 'FullyPaid' 
         THEN 1 
        ELSE 0 
        END) 
      ,PaidSum = sum(CASE 
        WHEN B.PaymentStatus = 'FullyPaid' 
         THEN (
           CASE 
            WHEN IsVAT = 1 
             AND @IncludeVAT = 1 
             THEN (Price/100) * 80 
            ELSE Price 
            END 
           ) 
        ELSE 0 
        END) 
      ,C.CategoryId 
      ,CategoryName 
     FROM Category c 
     LEFT JOIN Booking B ON C.CategoryId = B.CategoryId 
     WHERE B.AddedDateTime > @AddedAfter 
      AND ISNULL(B.IsCancelled, 0) = 0 
      AND (
       (
        B.StartTime BETWEEN @StartDate 
         AND @EndDate 
        ) 
       OR (
        B.StartTime BETWEEN @StartDate 
         AND @EndDate 
        ) 
       ) 
      AND (
       @HasObservation = 0 
       OR B.PatientID IN (
        SELECT PatientID 
        FROM PatientXObservation O 
        WHERE ObservationId IN (
          1 
          ,2 
          ,4 
          ) 
        ) 
       ) 
     GROUP BY YEAR(StartTime) 
      ,MONTH(StartTime) 
      ,C.CategoryId 
      ,CategoryName 
     ORDER BY 1 
      ,2 
      ,CategoryName 
    END 
END 

现在,我们要添加@IncludeCancelledBooking参数过滤。因此用户可以选择是否显示取消预订。截至目前该程序忽略取消预订,并只显示未取消预订..

我无法找到如何添加此条件,而分组记录。 我需要使用AND AND ISNULL(B.IsCancelled,0)= 0基于@IncludeCancelledBooking

回答

1

这是你想要的逻辑吗?

(@IncludeCancelled <> 'Y' OR Booking ISNULL(B.IsCancelled, 0) = 0) 
+0

'OR Booking ISNULL(B.IsCancelled,0)= 0' in this'Booking' is alias?我看不出它会如何工作。无论如何,我会尝试改变proc并让你知道。谢谢! – Developer

+0

它为我工作。 'AND(@IncludeCancelledBooking <> 0 or ISNULL(B.IsCancelled,0)= 0)' – Developer

0

如果IsCancelled也是BIT(如@IncludeCancelled),那么你可以使用:

AND ISNULL(B.IsCancelled, 0) IN (0, @IncludeCancelled) 

如果@IncludeCancelled为0,那么这是有效的,你现在有相同的逻辑(即= 0)。如果@IncludeCancelled是1,那么这包括其中IsCancelled = 1。

+0

如何使用AND ISNULL(B.IsCancelled,0)= @ IncludeCancelled'? – Developer

+0

如果'@ IncludeCancelled'为1,那么您将只*取消预订。如果你使用'IN',你会得到取消和未取消的预订。 –

0

假设您为变量@IncludeCancelled传递值1以包括取消的预订。然后像下面那样更改WHERE条件。

AND ISNULL(B.IsCancelled,0)= 
     CASE WHEN @IncludeCancelled=1 
        THEN ISNULL(B.IsCancelled,0) 
        ELSE 0 END