2013-02-27 2 views
0

Я использую базу данных SQL Server 2008R2. У меня есть запрос, который я использую для получения данных лабораторного результата из нашей базы данных для пациентов, которые имели более двух посещений нашего офиса. Вот запрос:Получить общее количество записей для групп данных в таблице

;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 

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

Спасибо!

UPDATE:

На рисунке ниже советы, я обновил запрос к следующему:

;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) 

Тем не менее, я все еще получаю «Arithmic ошибку переполнения преобразования VARCHAR в тип данных числовой "

Любая дополнительная помощь с благодарностью.

ответ

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() работает перед попытку преобразования.

+0

Этот запрос имеет смысл для меня, и кажется, что он должен работать, но я получаю сообщение об ошибке, которое говорит: «Ошибка при преобразовании значения varchar« 6.6 »в тип данных int« – MLorenzen

+0

@MLorenzen. , , Я подозреваю, что это происходит где-то еще в запросе. Где-то есть неявное преобразование от 6.6 до целого числа. Это может происходить, если ваши условия «result_value <7' и« result_value »являются varchar. В этом случае либо выполняйте явное преобразование ('cast (result_value as float) <7'), либо измените константу на 7.0. –

+0

спасибо за последующее наблюдение. Я добавил .0 к запросу, но теперь я получаю другую ошибку. Я добавил обновленный запрос выше. – MLorenzen

Смежные вопросы