0

SQL Server 2008R2 データベースを使用しています。私は、私たちのオフィスに 2 回以上来院した患者のラボ結果データをデータベースから取得するために使用するクエリを持っています。クエリは次のとおりです。

;WITH PatientData (patient_id,last_name, first_name, ethnic_group,
race, icdcode, encounter_date, test_performed, result_value,
result_units )
AS
(
SELECT pat.patient_id, pat.last_name, Pat.first_name, pat.ethnic_group,
pat.race, pl.icdcode, enc.encounter_date, lab.test_performed, lab.result_value,
lab.result_units
FROM dbo.dem_patient pat
RIGHT JOIN dbo.med_problemlist as pl
ON pat.patient_id = pl.patient_id
JOIN dbo.enc_encounter as enc
ON pat.patient_id = enc.patient_id
JOIN dbo.med_labresult as lab
ON pat.patient_id = lab.patient_id
WHERE pl.icdcode like '250%' AND
enc.encounter_date >= '01/01/2012' AND enc.encounter_date <= '12/31/2012' AND
pat.last_name != 'test' AND (lab.test_performed = 'HgbA1c' OR 
lab.test_performed = 'Hemoglobin A1c')
GROUP BY pat.patient_id, pat.last_name, Pat.first_name, pat.ethnic_group,
pat.race, pl.icdcode, enc.encounter_date, lab.test_performed, lab.result_value,
lab.result_units
)
SELECT patient_id,last_name, first_name, ethnic_group,
race, icdcode, encounter_date, test_performed, result_value,
result_units
FROM PatientData pd1 
WHERE EXISTS (SELECT patient_id 
                FROM PatientData pd2 
                WHERE pd2.patient_id  = pd1.patient_id  
                GROUP BY patient_id 
                HAVING COUNT(*)>1 )
ORDER BY pd1.race, pd1.ethnic_group

これは、患者のリストとその検査結果の値を取得する場合にうまく機能します。次のようなものが返されます。

patient_id    encounter_date    test_performed    result_value    result_units
00001         01/15/2012        HgbA1c            5.6             %
00001         05/03/2012        HgbA1c            8.6             %
00025         02/02/2012        HgbA1c            9.1             %
00064         07/01/2012        HgbA1c            7.6             %

ただし、このデータをグループ化し、結果の異なる値の間の結果の総数を取得したいと思います。たとえば、次のような結果が必要です。

LessThan7%    7%To8%     8%To9%    GreaterThan9%
775           289        365       154

CROSS JOIN関数を利用して、過去に同様のことを行うことができました。ただし、これほど複雑なクエリを使用することは決してありません。私は本当にいくつかの助けを使うことができました。

ありがとうございました!

アップデート:

以下のアドバイスに従って、クエリを次のように更新しました。

;WITH PatientData (patient_id,last_name, first_name, ethnic_group,
race, icdcode, encounter_date, test_performed, result_value,
result_units )
AS
(
SELECT pat.patient_id, pat.last_name, Pat.first_name, pat.ethnic_group,
pat.race, pl.icdcode, enc.encounter_date, lab.test_performed, lab.result_value,
lab.result_units
FROM dbo.dem_patient pat
RIGHT JOIN dbo.med_problemlist as pl
ON pat.patient_id = pl.patient_id
JOIN dbo.enc_encounter as enc
ON pat.patient_id = enc.patient_id
JOIN dbo.med_labresult as lab
ON pat.patient_id = lab.patient_id
WHERE pl.icdcode like '250%' AND
enc.encounter_date >= '01/01/2012' AND enc.encounter_date <= '12/31/2012' AND
pat.last_name != 'test' AND (lab.test_performed = 'HgbA1c' OR 
lab.test_performed = 'Hemoglobin A1c')
GROUP BY pat.patient_id, pat.last_name, Pat.first_name, pat.ethnic_group,
pat.race, pl.icdcode, enc.encounter_date, lab.test_performed, lab.result_value,
lab.result_units
)
select sum(case when isnumeric(result_value) = 1
       then (case when result_value < 7.0 then 1 else 0 end) 
       end) as [LessThan7%],
       sum(case when isnumeric(result_value) = 1
       then (case when result_value >= 7.0 and result_value < 8.0 then 1 else 0 end) 
       end) as [7%to8%],
       sum(case when isnumeric(result_value) = 1
       then (case when result_value >= 8.0 and result_value < 9.0 then 1 else 0 end) 
       end) as [8%to9%],
       sum(case when isnumeric(result_value) = 1
       then (case when result_value >= 9.0 then 1 else 0 end)
       end) as [GreaterThan9%]
FROM PatientData pd1 
WHERE EXISTS (SELECT patient_id 
                FROM PatientData pd2 
                WHERE pd2.patient_id  = pd1.patient_id  
                GROUP BY patient_id 
                HAVING COUNT(*)>1 )

ただし、「varchar をデータ型数値に変換する算術オーバーフロー エラー」が引き続き発生します。

追加のヘルプをいただければ幸いです。

4

1 に答える 1

1

これは条件付き集計です。

with query as (your query here)
select sum(case when result_value < 0.07 then 1 else 0 end) as [LessThan7%],
       sum(case when result_value >= 0.07 and result_value < 0.08 then 1 else 0 end) as [7%to8%],
       sum(case when result_value >= 0.08 and result_value < 0.09 then 1 else 0 end) as [8%to9%],
       sum(case when result_value >= 0.09 then 1 else 0 end) as [GreaterThan9%]
from query

with句に入るようにクエリを配置します。

result_value が文字として格納されている場合は、これを試してください。

select sum(case when isnumeric(result_value) = 1
                then (case when result_value < 0.07 then 1 else 0 end)
            end) as [LessThan7%],
       sum(case when isnumeric(result_value) = 1
                then result_value >= 0.07 and result_value < 0.08 then 1 else 0 end)
           end) as [7%to8%],
       sum(case when isnumeric(result_value) = 1
                then (case when result_value >= 0.08 and result_value < 0.09 then 1 else 0 end)
            end) as [8%to9%],
       sum(case when isnumeric(result_value) = 1
                then (case when result_value >= 0.09 then 1 else 0 end)
           end) as [GreaterThan9%]

変換が試行される前に実行caseされるようにするには、ネストされたステートメントが必要です。isnumeric()

于 2013-02-27T17:01:02.923 に答える