2016-11-02 2 views
2

Как никуда не годится и кажется таким простым.SQL-группировка и подсчет на основе дат

испытаний данные:

declare @table table(SpellAdminsionDate datetime, SpellDischargeDate datetime, Pat_code varchar(10)) 
insert into @table (SpellAdminsionDate, SpellDischargeDate, Pat_code) values('2016-09-12 15:55:00:000','2016-09-19 20:20:00:000','HEY3052275') 
insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-07 17:17:00:000','2016-09-17 18:40:00:000','HEY0810155') 
insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-14 16:50:00:000','2016-09-17 18:01:00:000','HEY1059266') 
insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-15 02:47:00:000','2016-09-15 17:28:00:000','HEY0742883') 
insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-08-27 00:11:00:000','2016-09-14 12:49:00:000','HEY3050628') 
insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-10 12:24:00:000','2016-09-13 20:00:00:000','HEY0912392') 
insert into @table(SpellAdminsionDate, SpellDischargeDate, Pat_code) values ('2016-09-12 12:51:00:000','2016-09-13 19:55:00:000','HEY0908691') 

Select * from @table` 

Ниже мой простой код отображения то же самое:

SELECT c.SpellAdmissionDate, 
     c.SpellDischargeDate, 
     c.Pat_Code 
FROM [CommDB].[dbo].[vwCivicaSLAM1617Live] c 
WHERE c.Hrg_Code like 'VA%' 
    and c.Pat_Code like 'HEY%' 
ORDER BY c.SpellDischargeDate desc 

Все я после является COUNT в день активных пациентов, например, взять 12/09/2016 в этот день результатом будет 5 (основанный на тестовых данных), так как остальные 2 камеры после 12-го.

Если это упростит, у меня есть таблица с датой, называемая DATE_REFERENCE, у которой есть все доступные мне даты.

+0

Добавьте в свой вопрос какую-то таблицу 'DATE_REFERENCE', Я получу ваш ответ довольно быстро. – Jens

ответ

0

Принимая во внимание возможность отсутствия пациентов в течение дня, вы хотите использовать справочную таблицу по дате в качестве первичного и левого соединения с информацией о пациенте. Вы не идентифицируете имя столбца, поэтому я просто использовал [datecol].

SELECT 
     d.[datecol]     the_date 
    , count(DISTINCT c.Pat_Code) num_patients 
FROM DATE_REFERENCE d 
LEFT JOIN [CommDB].[dbo].[vwCivicaSLAM1617Live] c 
      ON d.[datecol] BETWEEN c.SpellAdmissionDate AND c.SpellDischargeDate 
      AND c.Hrg_Code LIKE 'VA%' 
      AND c.Pat_Code LIKE 'HEY%' 
GROUP BY 
     d.[datecol] 
ORDER BY 
     d.[datecol] DESC 

Я подозреваю, что может быть больше, чем это требуется, но без выборки данных и ожидаемых результатов, трудно знать, что вам действительно нужно.

nb. Я предполагаю, что дата в таблице date_reference находится в полночь (00:00:00) или имеет тип данных даты (без часов/минут и т. Д.)

+0

Это выглядит близко Я проверяю сейчас быть 100% – Simon

+0

Ding Dang Do , это именно то простое решение, которое я искал, и знал, что он где-то здесь, спасибо вам, пожалуйста, – Simon

+0

Отлично. Я предполагаю, что вы затем отметьте это как решение, чтобы другие знали, что на вопрос был дан ответ. –

0

Это то, что вы хотите?

SELECT dr.date, 
     (SELECT COUNT(*) 
     FROM [CommDB].[dbo].[vwCivicaSLAM1617Live] c 
     WHERE dr.date between c.SpellAdmissionDate and c.SpellDischargeDate) as cnt_per_day 
FROM DATE_REFERENCE dr 

Добавить фильтры, которые вы хотите скорректировать.

0

Вы можете достичь этого путем присоединения к вашей дате справочной таблице и подсчета по особым обращению пациента

SELECT 
dateRef 
,COUNT(DISTINCT Pat_Code) AS PatCount 
FROM @table t 
RIGHT JOIN @date_reference 
ON SpellAdminsionDate <= dateRef 
AND SpellDischargeDate >= dateRef 
GROUP BY dateRef; 
-1

Я думаю, что вам нужно, чтобы привести таблицу DATE_REFERENCE в запрос Если он содержит все даты дня что вам нужно подсчитать пациент, основанные на них, но вот пример того, как может вам получить требуемый результат сформировать эту таблицу только

Select DISTINCT c.SpellAdmissionDate, count(c.Pat_code) as PCounter 
    From [CommDB].[dbo].[vwCivicaSLAM1617Live] c 
    GROUP BY c.SpellAdmissionDate 
    ORDER BY c.SpellAdmissionDate desc 
+0

никогда не используйте 'select distinct' и' group by' таким образом ... группа по определению создает отличительные строки, делающие 'selectlect' полностью избыточным –

0

Активное количество пациентов на сегодняшний день может быть достигнут путем (данные для временных предусмотренных здесь)

SELECT DISTINCT CAST(T1.SPELLADMINSIONDATE AS DATE) 
    AdmissionDate,PATIENTS.TotalActive 
    FROM @TABLE T1 
    CROSS APPLY (SELECT COUNT(*)TotalActive FROM @TABLE T2 WHERE 
    CAST(T2.SPELLADMINSIONDATE AS DATE)<=CAST(T1.SPELLADMINSIONDATE AS DATE)) PATIENTS