Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
Author |
Topic |
JeffS23
Posting Yak Master
212 Posts |
Posted - 2009-09-29 : 12:04:17
|
Please note, the SQL is handled dynamically by the server, therefore some items in my WHERE clause will look odd to you - please disregard this. I am getting the following error and need a hand. Msg 245, Level 16, State 1, Line 157Conversion failed when converting the varchar value '6.2' to data type int.Looks like its coming from the obs.OBSVALUE field. When I used this query: select * from obs where ObsValue = '6.2' and HDID IN (53,54)I got back several rows. So I think this is whats causing my issue, since my original error message was "Conversion failed when converting the varchar value '6.2' to data type int."[CODE]SET NOCOUNT ON CREATE TABLE #Patients ( PatientProfileID INT, PatientID VARCHAR(15), MRN VARCHAR(15), PID NUMERIC, PatientName VARCHAR(100), Birthdate DATETIME, Age VARCHAR(15), Sex VARCHAR(1), RaceCode VARCHAR(50), EthnicityCode VARCHAR(50), RaceMID2 INT )DECLARE @AgeDate DATETIMEDECLARE @DXDate DATETIMESET @AgeDate = '12/31/' + CONVERT(VARCHAR , YEAR('08/31/2009'))SET @DXDate = '06/30/' + CONVERT(VARCHAR , YEAR('08/31/2009'))INSERT INTO #Patients SELECT pp.PatientProfileID, pp.PatientID, pp.MedicalRecordNumber AS MRN, pp.PID, RTRIM(RTRIM(ISNULL(pp.Last , '') + ' ' + ISNULL(pp.Suffix , '')) + ', ' + ISNULL(pp.First , '') + ' ' + ISNULL(pp.Middle , '')) AS PatientName, pp.Birthdate, ( DATEDIFF(day , pp.Birthdate , @AgeDate) / 365.25 ) AS Age, pp.Sex, CASE WHEN r.Code = 'H' OR e.Code = 'H' THEN 'Hispanic/Latino' WHEN r.Code = 'A' THEN 'Asian' WHEN r.Code = 'NH' THEN 'Native Hawaiian' WHEN r.Code = 'OPI' THEN 'Other Pacific Islander' WHEN r.Code = 'B' THEN 'Black/African American' WHEN r.Code = 'AI' THEN 'American Indian/Alaskan Native' WHEN r.Code = 'W' THEN 'White' WHEN r.Code = 'M' THEN 'More than one race' WHEN r.Code = 'U' THEN 'Unreported' ELSE 'Unreported' END AS RaceCode, CASE WHEN r.Code = 'H' OR e.Code = 'H' THEN 'Hispanic/Latino' ELSE 'All Others' END AS EthnicityCode, cri.RaceMID2 FROM PatientProfile pp LEFT JOIN PatientVisit pv ON pp.PatientProfileID = pv.PatientProfileId LEFT JOIN cusCRIInterview cri ON pp.patientprofileid = cri.patientprofileid LEFT JOIN Medlists r ON pp.RaceMID = r.MedListsID LEFT JOIN cusCRIMedLists e ON cri.RaceMID2 = e.MedListsID WHERE --Filter on facility ( ( NULL IS NOT NULL AND pv.FacilityID IN ( NULL ) ) OR ( NULL IS NULL ) ) AND --Filter on Company ( ( NULL IS NOT NULL AND pv.CompanyID IN ( NULL ) ) OR ( NULL IS NULL ) ) AND ( DATEDIFF(day , pp.Birthdate , @AgeDate) / 365.25 ) > 17.99 AND DATEPART(Year , pv.visit) = DATEPART(Year , '08/31/2009') -- limit to visits in this year AND pp.PatientProfileID IN -- now we filter on diagnosis, independently ( SELECT PatientProfileID FROM PatientProfile pp JOIN Orders o ON pp.PID = o.PID JOIN Orddx ON o.dxgroupid = orddx.dxgroupid WHERE orddx.dxcode LIKE ( 'icd-401.%' ) AND o.XID = 1000000000000000000 AND o.OrderDate <= @DXDate ) GROUP BY pp.PatientProfileID, pp.PatientId, pp.MedicalRecordNumber, pp.PID, pp.Birthdate, pp.Sex, pp.Last, pp.Suffix, pp.First, pp.Middle, r.code, e.code, cri.raceMID2 HAVING COUNT(*) > 1 -- must have 2+ visits this yearSELECT PatientProfileID, COUNT(*) AS cnt, PatientID, MRN, PID, PatientName, Birthdate, Age, Sex, RaceCode, EthnicityCode, RaceMID2INTO #tmpFROM #PatientsGROUP BY PatientProfileID, PatientID, MRN, PID, PatientName, Birthdate, Sex, age, RaceCode, EthnicityCode, RaceMID2ORDER BY CASE WHEN '1' = 1 THEN MRN WHEN '1' = 2 THEN PatientName WHEN '1' = 3 THEN PatientID ELSE NULL ENDDECLARE @StartDate DATETIMEDECLARE @EndDate DATETIMESET @StartDate = CONVERT(VARCHAR , YEAR('08/31/2009')) + '/01/01'SET @EndDate = CONVERT(VARCHAR , YEAR('08/31/2009')) + '/12/31'--select * from obs where ObsValue = '6.2' and HDID IN (53,54)ALTER TABLE #TMPADD ObsValue VARCHAR(2000) NULLUPDATE #TMPSET ObsValue = '1'FROM OBS obs JOIN #TMP ON obs.PID = #TMP.pid JOIN ( SELECT pid, MAX(obsdate) AS obsmax FROM obs WHERE ( ( HDID = 54 AND CASE WHEN ISNUMERIC(REPLACE(obs.OBSVALUE , ' mmHg' , '')) = 1 THEN REPLACE(obs.OBSVALUE , ' mmHg' , '') ELSE NULL END < 140 ) OR ( HDID = 53 AND CASE WHEN ISNUMERIC(REPLACE(obs.OBSVALUE , ' mmHg' , '')) = 1 THEN REPLACE(obs.OBSVALUE , ' mmHg' , '') ELSE NULL END < 90 ) ) AND obsdate >= @StartDate AND obsdate <= @EndDate GROUP BY pid ) t ON obs.PID = t.PID AND obs.obsdate = t.obsmaxWHERE ( ( HDID = 54 AND CASE WHEN ISNUMERIC(REPLACE(obs.OBSVALUE , ' mmHg' , '')) = 1 THEN REPLACE(obs.OBSVALUE , ' mmHg' , '') ELSE NULL END < 140 ) OR ( HDID = 53 AND CASE WHEN ISNUMERIC(REPLACE(obs.OBSVALUE , ' mmHg' , '')) = 1 THEN REPLACE(obs.OBSVALUE , ' mmHg' , '') ELSE NULL END < 90 ) )SELECT *FROM #TMP DROP TABLE #tmpDROP TABLE #Patients[/CODE] |
|
Ifor
Aged Yak Warrior
700 Posts |
Posted - 2009-09-29 : 12:53:00
|
The quick way to solve your problem is to compare to a float, not an int.eg:HDID = 54 ANDCASE WHEN ISNUMERIC(REPLACE(obs.OBSVALUE , ' mmHg' , '')) = 1 THEN REPLACE(obs.OBSVALUE , ' mmHg' , '') ELSE NULLEND < 140.0 |
|
|
visakh16
Very Important crosS Applying yaK Herder
52326 Posts |
Posted - 2009-09-29 : 13:54:04
|
cross posthttp://www.sqlteam.com/forums/topic.asp?TOPIC_ID=133495 |
|
|
|
|
|
|
|