2016-09-24 3 views
0

주어진 기간 동안 보고서를 표시하는 작업 절차가 있습니다. PROC 아래 시간의 주어진 기간에 대한 모든 예약을 찾아 이제 우리는 매개 변수를 @IncludeCancelledBooking 필터 를 추가 할조건부 그룹을 사용할 때

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 

enter image description here 매달 그룹에 대해 보여줍니다. 따라서 사용자는 취소 된 예약을 표시할지 여부를 선택할 수 있습니다. 현재 절차는 취소 된 예약을 무시하고 취소되지 않은 예약 만 표시합니다 ..

레코드를 그룹화하는 동안이 조건을 추가하는 방법을 찾을 수 없습니다. 내가 사용해야와 ISNULL (B.IsCancelled, 0) = 0

답변

1

이 원하는 로직을 @IncludeCancelledBooking에 따라? 0

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

@IncludeCancelled 경우,이 당신이 지금 가지고있는 같은 논리 (즉 = 0)이 효율적이다 : IsCancelled 만약

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

이 예약에서 '예약 ISNULL (B.IsCancelled, 0) = 0'은 별칭입니까? 나는 그것이 어떻게 작동하는지 보면서 얻을 수 없었다. 어쨌든 나는 proc을 바꾸고 당신에게 알려줄 것입니다. 고맙습니다! – Developer

+0

그것은 나를 위해 일했습니다. 'AND (@IncludeCancelledBooking <> 0 또는 ISNULL (B.IsCancelled, 0) = 0)' – Developer

0

는, 당신은 사용할 수 또한 BIT (같은 @IncludeCancelled)입니다. @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 
관련 문제