2013-03-05 21 views
0

我對SQL Server 2008相當陌生,而且遇到了問題。我有一個包含實驗室結果的varchar(255)列的表。在列中的數據看起來是這樣的:如何針對包含數字和文本的varchar列運行條件聚合

result_value 
7.0 
162 
NEGATIVE 
SEE NOTE 
9.6 

現在,我想要做的是運行以下查詢:

;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 result_value < 7.0 then 1 else 0 end) as [LessThan7%], 
     sum(case when result_value >= 7.0 and result_value < 8.0 then 1 else 0 end) as [7%to8%], 
     sum(case when result_value >= 8.0 and result_value < 9.0 then 1 else 0 end) as [8%to9%], 
     sum(case when result_value >= 9.0 then 1 else 0 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) 

因爲我只應返回誰曾患者一個A1c測試執行,results_value列應該總是看起來像xx - 然而,我試圖運行這個查詢,我得到「算術溢出錯誤將varchar轉換爲數據類型數字

雖然我意識到把這些不同類型的數據一起在同一列不是理想的,我沒有創建數據庫 - 我只需要使用它。反正有這個問題嗎?

謝謝你的幫助。

+0

您是否考慮過使用** ISALPHA **來清除「非數字」值? – 2013-03-05 15:53:09

+0

我已經做了一些研究,但你能給我一個這可能如何幫助的例子嗎? – MLorenzen 2013-03-05 18:37:01

+0

我的假設是,你的問題是由於隱含的文字轉換爲數字。因此,如果您可以確定您的字段不是有效的數字,那麼您可以希望將其從邏輯中排除。 – 2013-03-05 18:53:41

回答

0

您可以使用這種解決方案。讓我們考慮一下這個表格和數據。

CREATE TABLE [tb](
[id] [int] IDENTITY(1,1) NOT NULL primary key, 
[result] [varchar](50) NULL, 
) ON [PRIMARY] 
INSERT [tb] ([id], [result]) VALUES (1, N'12') 
INSERT [tb] ([id], [result]) VALUES (2, N'24') 
INSERT [tb] ([id], [result]) VALUES (3, N'35') 
INSERT [tb] ([id], [result]) VALUES (4, N'NEGATIVE') 
INSERT [tb] ([id], [result]) VALUES (5, N'SEE NOTE') 
INSERT [tb] ([id], [result]) VALUES (6, N'15.5') 
INSERT [tb] ([id], [result]) VALUES (7, N'16.4') 

您可以使用ASCII功能(ASCII返回字符表達式的最左邊字符的ASCII碼值。)從這個樣品得到正確的數字數據

select id,ascii(result),convert(decimal(16,2),result) as result from tb 
where ascii(result)>=ascii('0') and ascii(result)<=ascii('9') 
    union 
select id,ascii(result),-1.0 as result from tb 
where ascii(result)<=ascii('0') or ascii(result)>=ascii('9') 

您可以標記無效記錄爲你要。您可以爲此查詢添加更多邏輯。您可以將其用作子查詢或「加入」。 我希望它能幫助你。

Marcin Pazgier

相關問題