2010-01-18 2 views
1

덕분에 키의 수를 계산 : 이것은 그것의 연장이SQL 서버 2008 : 여러 테이블에서 여러 날짜 범위에서 오늘 아침에 내 질문에 대답 사람들에게

SQL Server 2008: Count Number of Keys In Multiple Date Ranges

입니다 그리고 난 분명하지 않다 이 경우 이전 솔루션을 일반화하는 방법.

내가 작업하고있는 데이터베이스에는 의약품, 실험실 값 및 여러 테이블의 환자 세트에 대한 진단이 있습니다.

년 동안

X = 1996 2008 : 위의 질문에 대한 유사

내가 년 X에 규정 된 특정 약을 한 환자의 수를 계산하려면, 특정 실험실 값 (년 X에서 촬영 이 마지막 하나는 조금 다릅니다!) 그리고 x 년도에 아직 해결되지 않은 1996 년 또는 그 이후의 구체적인 진단.

편집 : 그것은 하지 pt_id 것으로 밝혀 테이블의에서 기본 키 - (때문에 DISTINCT 느린 것)하지만 별개 사용되는 솔루션으로 잘 될 것이라고 나는 SELECT COUNT DISTINCT(pm.pt_id)을 읽어 봤는데 것과 그것이 효과가 있었다면. 여기

혼자 2008 년에 대한 쿼리,하지만 다시 나는이 시도 2008 년

SELECT COUNT (pm.pt_id) 
FROM dm.medications pm 
/*patient was prescribed statins together with fibrates this year*/ 
WHERE pm.pt_id IN 
(
    SELECT statins.pt_id 
    FROM dm.patient_medications statins 
    INNER JOIN dm.patient_medications other_meds 
    ON statins.pt_id = other_meds.pt_id 
    WHERE Year(other_meds.order_dts) = 2008 
    AND Year(statins.order_dts) = 2008 
    AND statins.generic_nm in ('Atorvastatin','Cerivastatin') 
    AND other_meds.generic_nm in ('Clofibrate','Fenofibrate','Gemfibrozil') 
) 
/* patient had a diagnosis code in the list first diagnosed in 1996 or later and not yet resolved in this year */ 
WHERE pm.pt_id in 
(
    SELECT pd.pt_id, 
    FROM dm.diagnoses pd 
    WHERE pd.icd9_cd IN('728.89','729.1','710.4','728.3','729.0','728.81','781.0','791.3') 
    AND Year(pd.init_noted_dts) >= 1996 
    AND pd.rslvd_dts IS NOT NULL 
    AND Year(pd.rslvd_dts) >= 2008 
) 
/* patient had a lab value above 1000 this year */ 
AND pm.pt_id IN 
(
    SELECT pl.pt_id 
    FROM dm.labs pl 
    WHERE pl.lab_val > 1000 
    AND pl.lab_val IS NOT NULL 
    AND pl.lab_val < 999999 
    AND pl.lab_nm = 'CK (CPK)' 
    AND Year(pm.order_dts) = 2008 
) 
/* we have demographic information about this patient */ 
AND pm.pt_id IN 
(
    SELECT p.pt_id 
    FROM mrd.demographics p 
) 
/* this is a real person */ 
AND pm.pt_id IS NOT NULL 

답변

1

로 1996 년부터 매년의 값을 계산하는 쿼리를 원하는 :

SELECT COUNT(*), t1.year 
FROM dm.medications pm 
/*patient was prescribed statins together with fibrates this year*/ 
inner join (
    SELECT statins.pt_id, Year(other_meds.order_dts) as Year 
    FROM dm.patient_medications statins 
    INNER JOIN dm.patient_medications other_meds ON statins.pt_id = other_meds.pt_id 
     AND Year(other_meds.order_dts) = Year(statins.order_dts) 
    WHERE statins.generic_nm in ('Atorvastatin','Cerivastatin') 
     AND other_meds.generic_nm in ('Clofibrate','Fenofibrate','Gemfibrozil') 
) t1 on pm.pt_id = t1.pt_id 
/* patient had a diagnosis code in the list first diagnosed in 1996 or later and not yet resolved in this year */ 
left outer join 
(
    SELECT pd.pt_id, Year(pd.rslvd_dts) as Year 
    FROM dm.diagnoses pd 
    WHERE pd.icd9_cd IN ('728.89','729.1','710.4','728.3','729.0','728.81','781.0','791.3') 
     AND Year(pd.init_noted_dts) >= 1996 
) t2 on pm.pt_id = t2.pt_id and t1.Year = t2.Year 
/* patient had a lab value above 1000 this year */ 
inner join (
SELECT pl.pt_id, Year(pm.order_dts) as Year 
    FROM dm.labs pl 
    WHERE pl.lab_val > 1000 
     AND pl.lab_val < 999999 
     AND pl.lab_nm = 'CK (CPK)' 
) t3 on pm.pt_id = t3.pt_id and t2.Year = t3.Year 
/* we have demographic information about this patient */ 
inner join (
    SELECT p.pt_id 
    FROM mrd.demographics p  
) t4 on pm.pt_id = t4.pt_id and t3.Year = t4.Year 
/* this is a real person */ 
where pm.pt_id IS NOT NULL 
    and t1.year between 1996 and 2008 
    and t2.Year is null 
group by t1.year 
+0

감사를 다시 오브먼! 위의 편집을 참조하십시오 (pt_id는 기본 키가 아닙니다). 또한, 매년 'AND Year (pm.order_dts) = 2008'과'AND Year (pd.rslvd_dts)> = 2008'을 수행 할 수 있는지 잘 모르겠다. 그 해 (2008 년이 아닐 수도 있음)의'order_dts'와 그 해의 언젠가 ('2008 년이 아닐지도 모른다)'resolved_dts. – raoulcousins

+0

개정판을 사용해보십시오. – RedFilter

+0

흠. 가져 오는 메시지 207, 수준 16, 상태 1, 줄 32 'year'잘못된 열 이름입니다. ('t4 pm.pt_id = t4.pt_id 및 t3.Year = t4.Year'에있는't4 행) 그러나 문제가있는 곳을 보지 못했습니다. 마지막 내부 조인을 주석 처리하면 레코드가 반환되지 않습니다. – raoulcousins