Я чрезвычайно новичок в этом, но мне удалось решить, как вернуть общее количество дней в очереди для конкретного пациента за индивидуальный параметр. См. Таблицу данных текущих результатов.Возвратите общее количество дней линии из нескольких случаев для одного пациента из диапазона дат
Каждый пациент считается только один раз, независимо от того, сколько строк у них есть. Проблема заключается в том, что при перекрытии линейных дней. Мне нужно иметь возможность вернуть общее количество дней линии для пациента.
Окончательная колонка в таблице была добавлена вручную.
Текущие результаты:
SELECT
PendingRangeSignals.PendingOrderID,
PendingOrders.PatientID,
Parameters.ParameterName,
(SELECT CONVERT(VARCHAR, PendingRangeSignals.StartTime, 103) + ' ' + CONVERT(VARCHAR, DATEPART(hh, PendingRangeSignals.StartTime)) + ':' + RIGHT('0' + CONVERT(VARCHAR, DATEPART(mi, PendingRangeSignals.StartTime)), 2) AS Date) as "Start Time Column",
(SELECT CONVERT(VARCHAR, RangeSignals.EndTime, 103) + ' ' + CONVERT(VARCHAR, DATEPART(hh, RangeSignals.EndTime)) + ':' + RIGHT('0' + CONVERT(VARCHAR, DATEPART(mi, RangeSignals.EndTime)), 2) AS Date) as "End Time Column",
iif(datepart(hh,PendingRangeSignals.StartTime)>= 0 OR
CASE
WHEN RangeSignals.EndTime IS NULL
THEN datediff(hh,PendingRangeSignals.StartTime,isnull(RangeSignals.EndTime,getdate()))
ELSE datediff(hh,PendingRangeSignals.StartTime,RangeSignals.EndTime)
END < 24,
datediff(d,iif(PendingRangeSignals.StartTime < DATEADD(month, DATEDIFF(month, 0, getdate()), 0), DATEADD(month, DATEDIFF(month, 0, getdate()), 0),PendingRangeSignals.StartTime) , dateadd(day,1,isnull(RangeSignals.EndTime,getdate()))),
datediff(d,iif(PendingRangeSignals.StartTime < DATEADD(month, DATEDIFF(month, 0, getdate()), 0), DATEADD(month, DATEDIFF(month, 0, getdate()), 0),PendingRangeSignals.StartTime) , isnull(RangeSignals.EndTime,getdate()))) as "LineDaysinMonth"
FROM
PendingRangeSignals INNER JOIN
PendingOrders ON PendingRangeSignals.PendingOrderID = PendingOrders.PendingOrderID INNER JOIN
Parameters ON PendingRangeSignals.ParameterID = Parameters.ParameterID
LEFT JOIN RangeSignals ON RangeSignals.ParameterID = Parameters.ParameterID and RangeSignals.PatientID = PendingOrders.PatientID and PendingRangeSignals.StartTime = RangeSignals.StartTime
WHERE
(PendingOrders.PatientID = 2105) and pendingorders.Status = 5 and ((datepart(month,RangeSignals.EndTime) = datepart(month,getdate())) or RangeSignals.EndTime is null) and [Parameters].ParameterID IN (1046, 1372, 8546, 1051, 8532, 8538, 1375, 8531, 8888)
Учитывая, что у пациента могут быть введены и выведены линии, «дни с линией» не обязательно непрерывны. Я не думаю, что это можно решить с помощью одного запроса. Возможно, вам придется получить все данные, а затем пропустить их, чтобы подсчитать конкретные календарные дни. –
Это, вероятно, будет легче читать (и решать), если вы устраните посторонние вещи (например, pendingorders.Status = 5), чтобы свести к минимуму точно вопрос, который вы пытаетесь решить. Кроме того, было бы полезно упростить структуру таблиц. –
Что значит «когда перекрываются линейные дни»? пожалуйста, покажите образцы таблиц. – koriander