2016-11-02 2 views
2

여기에 아무 것도 없기 때문에 매우 간단 해 보입니다.날짜를 기반으로 한 SQL 그룹화 및 계산

테스트 데이터는 다음 12/09/2016을 예를 들어,

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입니다 :

다음
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` 

이 같은 일을 표시 내 간단한 코드입니다 해당 날짜에 결과는 5 (테스트 데이터 기준)이며 다른 12 캠은 12 일 후입니다.

더 쉽게 만들려면 DATE_REFERENCE이라는 날짜 참조 테이블이 있어야합니다.이 날짜는 사용 가능한 모든 날짜가 있습니다.

+0

질문에 'DATE_REFERENCE' 테이블 중 일부를 추가하면' 꽤 빨리 답을 얻을 수 있습니다. – Jens

답변

0

하루에 환자가 없을 가능성을 허용하면 날짜 참조 테이블을 기본 정보로 사용하고 환자 정보에 왼쪽으로 결합하려고합니다. 당신은 열 이름을 식별하지 않으므로 방금 [datecol]을 사용했습니다.

이보다 더 많은 데이터가있을 수 있지만 샘플 데이터가없고 예상되는 결과가 없으면 실제로 필요한 것을 알기가 어렵습니다.

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'을 사용하지 마십시오 ... 그룹은 정의에 의해 반드시 고유 행을 만들어야합니다'select distinct'는 완전히 중복됩니다 –

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