У меня есть процедура, которая подсчитывает счет и общую стоимость за каждый месяц.SQL WHERE clause as JOIN query
Теперь мне нужно передать дополнительный параметр @HasObservation
в качестве дополнительного параметра. Логика для фильтрации - это не просто обычный фильтр поля. Его необходимо отфильтровать, присоединившись к другой таблице PatientXObservation. Если в этой таблице есть записи для значения 1,2,4, то только фильтровать эти заказы.
@ HasObservation = 1 среднее, FETCH RECORDS удовлетворяет этому условию
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, мне нужно, чтобы избежать этого фильтра, но, к сожалению, он выбирает наблюдение = 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 отсутствует в этом списке. – Biscuits