【发布时间】:2016-08-10 22:17:23
【问题描述】:
我有以下程序来获取每个月的预订数量和总价。
现在我需要将附加参数@HasObservation 作为附加参数传递。过滤的逻辑不仅仅是一个普通的字段过滤器。它必须通过加入其他表 PatientXObservation 来过滤。如果此表包含值 1、2、4 的条目,则仅过滤这些预订。
@HasObservation=1 表示,获取记录满足此条件
PatientXObservation O ON B.PatientId = O.PatientId
AND O.ObservationId IN (1,2,4)
如何在下面的 SQL 中添加这个过滤器?我不确定如何在此处添加此内容
CREATE PROCEDURE [dbo].[GetDoctorOperationReportTest]
( @IncludeVAT BIT = 0, @HasObservation BIT = 0 )
AS
BEGIN
SET NOCOUNT ON
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
, C.CategoryId
, CategoryName
FROM Category c
LEFT JOIN Booking B ON C.CategoryId = B.CategoryId
WHERE
C.IncludeReport = 1
GROUP BY YEAR(StartTime), MONTH(StartTime), C.CategoryId, CategoryName
ORDER BY 1, 2, CategoryName
END
我已尝试使用 TEMP 表,但查询运行非常非常慢。这里的另一个问题是如果@HasObservation 为0,我需要避免使用此过滤器,但不幸的是它选择了observation=0 :(
SELECT B.BookingId
,B.StartTime
,B.IsVAT
,B.Price
,c.CategoryId
,c.CategoryName
,c.IncludeReport
,observation = (
CASE
WHEN isnull(o.PatientId, 0) = 0
THEN 0
ELSE 1
END
)
INTO #Temp
FROM Category c
LEFT JOIN Booking B ON C.CategoryId = B.CategoryId
LEFT JOIN PatientXObservation O ON B.PatientId = O.PatientId
AND O.ObservationId IN (1,2,4)
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
,CategoryId
,CategoryName
FROM #Temp
WHERE IncludeReport = 1
AND observation = @HasObservation
GROUP BY YEAR(StartTime)
,MONTH(StartTime)
,CategoryId
,CategoryName
ORDER BY 1
,2
,CategoryName
【问题讨论】:
-
考虑一个 SELECT 语句,您可以使用它来简单地返回您不感兴趣的所有 PatientId,作为一组键。然后,您可以使用外部连接来确保 B.PatientId 不在该列表中。
标签: sql sql-server sql-server-2012 where-clause sql-server-express