Error: Conversion failed when converting the varchar value 'PENDG' to data type int.

Hi,

I am a novice at T-SQL and need help. The following code works fine. However, I need to remove the condition at the bottom - "where EMPLOYMENT_DATE > 0 ". When I do this, it gives me the error: Conversion failed when converting the varchar value 'PENDG' to data type int.

I noticed that 'PENDG' is a SOURCE_CODE in the  OHSDPROD.SOURCE table. This table has only 2 columns. The create table script of it is 

CREATE TABLE [ohsdprod].[SOURCE](
[SOURCE_CODE] [nvarchar](5) NULL,
[SOURCE_DESCRIP] [nvarchar](70) NULL
) ON [PRIMARY];

some sample rows are:

                                       

SOURCE_CODE SOURCE_DESCRIP
N/A                 NOT APPLICABLE
N/C                 NOT CONVERTIBLE TO THIS SCHEME
PENDG              PENDING SOURCE OF INJURY

Kindly assist to resolve. This is urgent.

Thanks,

Nita

SELECT 
  LTRIM(FIRM_NO) wsib, 
  convert(date,convert(varchar(10),accident_date,110),110) accident_date, 
  substring((case when
           (SELECT top 1 D.NATURE_CODE FROM OHSDPROD.NATURE D WHERE d.NATURE_CODE  = NATURE_INJURY)= NATURE_INJURY
           then (SELECT top 1 D.NATURE_DESCRIP FROM OHSDPROD.NATURE D where d.NATURE_CODE = NATURE_INJURY)
           else cast(NATURE_INJURY as varchar(50)) end),1,50) NATURE_INJURY,
           
  substring((case when (SELECT top 1 D.SOURCE_CODE FROM OHSDPROD.SOURCE D WHERE 
              D.SOURCE_CODE = source_INJURY ) = source_INJURY
           then (SELECT top 1 D.SOURCE_DESCRIP FROM OHSDPROD.SOURCE D WHERE 
          D.SOURCE_CODE = source_INJURY) else cast(SOURCE_INJURY as varchar(50)) end),1,50) SOURCE_INJURY,
  substring((case when (SELECT top 1 D.ACC_TYPE_CODE FROM OHSDPROD.ACC_TYPE D WHERE 
             D.ACC_TYPE_CODE=Accident_type) = Accident_type
             then (SELECT top 1 D.ACC_TYPE_DESCRIP FROM OHSDPROD.ACC_TYPE D WHERE 
             D.ACC_TYPE_CODE=Accident_type) else cast(ACCIDENT_TYPE as varchar(50)) end ),1,50) ACCIDENT_TYPE, 
  substring((case when (SELECT top 1 D.BODY_CODE FROM OHSDPROD.BODYPART D WHERE 
                     D.BODY_CODE=body_part) = body_part then
            (SELECT top 1 D.BODY_DESCRIP FROM OHSDPROD.BODYPART D WHERE 
             D.BODY_CODE=body_part) else cast(BODY_PART as varchar(50)) end),1,50) BODY_PART,
  substring(( case when (SELECT top 1 D.OCC_CODE FROM OHSDPROD.OCCUPATION D WHERE 
           D.OCC_CODE=occupation_code) = occupation_code then 
          (SELECT top 1 D.OCC_DESCRIP FROM OHSDPROD.OCCUPATION D WHERE 
           D.OCC_CODE=occupation_code) else cast(OCCUPATION_CODE as varchar(50)) end),1,50) OCCUPATION,
  CUMULATIVE_TEMP_BENEFITS_COST COSTS,
  ROUND(datediff(dd,convert(varchar(10),employment_DATE,110), convert(varchar(10),accident_DATE,110)) /30,2) EMPMTHS,
  substring(( case when (SELECT 1 FROM ohsdprod.WCB_CLAIM W2 WHERE W1.CLAIM_ID = W2.CLAIM_ID 
				AND NATURE_INJURY = 03500 AND BODY_PART IN (03200, 03202, 03290)) = 1 then 'SERIOUS'
			when 
           (SELECT 1 FROM ohsdprod.WCB_CLAIM W2 WHERE W1.CLAIM_ID = W2.CLAIM_ID 
            AND NATURE_INJURY IN (01000,01300,01400,01800,01900,03600,05000,05100,05101,05102,05103,05190,05200,05201,05202,05203,05290,05300,05302,05303,05800,06000,06100,06800,06900,07120,07210,07220,07310,07320,07330,08000,08500,08600,
                                  08901,08902,09300,09400,09500,09510,09520,09710,03800,05301,07230,07240,08900,03110,03700,41110,09100,09100,09200,06200,08400,01200,08300,03100,03190)) = 1 then 'SERIOUS' else ' ' end),1,10) SERIOUS, 
            --Ergo mapping provided by Elaine Wong.
  --substring(( case when NATURE_INJURY in (230,381,382,383,384,385,389) then 'ERGO'
  --       when ACCIDENT_TYPE in (81,82,83,85,102,120,121,122,123,129,998,999) then 'ERGO' else ' ' end),1,10) ERGO,
  substring((CASE
WHEN NATURE_INJURY IN
(02001, 02100, 02101, 02102, 02190, 02900, 02901, 02902, 02903, 02904, 02905, 02906, 02907, 02908, 02909, 02910, 02911, 02912, 02913, 02914, 02915, 02916, 02917, 02918, 02919, 02920, 02922, 02923, 08200, 09720, 09730, 12410, 13710,      15300, 15310, 15320, 15330,   15390, 17000, 17200, 17201, 17202, 17210, 17220, 17230, 17231, 17232, 17233, 17239, 17290, 17291, 17292, 17293,     17300, 17310, 17320, 17330, 17340, 17350, 17360, 17370, 17390, 17391, 17392, 17393, 17394, 17395, 17400, 17410, 17490, 17900, 17901, 41200, 41230, 41280, 41290, 41480, 41490)
THEN 'ERGO'
WHEN ACCIDENT_TYPE IN 
('20000','21000','21100','21200','21300','21400','21500','21501','21502','21503','21509','21600','21700','21900','22000','22100','22200','22300','22400','22900','22901','23000','23100','23200','23300','23900','24000','25000','26000','27000','29000','29001') 
THEN 'ERGO'
ELSE ' '
END), 1, 10) ERGO,

  --(case when coalesce(BIRTH_DATE,0) <= 17530101 then 0 else 
  --   datediff(dd,convert(datetime,SUBSTRING(cast(birth_date as varchar(8)),1,4) + SUBSTRING(cast(birth_date as varchar(8)),5,2) + 
  --   SUBSTRING(cast(birth_date as varchar(8)),7,2),110),
  --   convert(datetime,SUBSTRING(cast(accident_date as varchar(8)),1,4) + SUBSTRING(cast(accident_date as varchar(8)),5,2) + 
  --   SUBSTRING(cast(accident_date as varchar(8)),7,2),110))/365.25 end) AGE,
  age,
  GENDER,
  --
  --(case when language_code not in ('01','57','58') then 'YES' else ' ' end) FOREIGN_1, 
  (case when language_code not in ('EN','FR') then 'YES' else ' ' end) FOREIGN_1, 
GEOGRAPHIC_LOCATION GEO_LOC,WORKSITE
FROM ohsdprod.WCB_CLAIM W1
where EMPLOYMENT_DATE > 0
AND ACCIDENT_year > 2006
--
--and coalesce(cumulative_days_lost,0)  > 0
and claim_type = 'LT'



  • Edited by NitaM Thursday, August 27, 2015 4:11 PM
August 27th, 2015 4:09pm

What is the type of source_INJURY in your main table?

What is the type of Employment_Date? Why do you convert accident_date twice - there is no need for that at all?

The query needs to be re-written and simplified, right now it's hard to read and understand.

Free Windows Admin Tool Kit Click here and download it now
August 27th, 2015 4:14pm

You neeed to single quote all string values  like:  

BODY_PART IN ( '03200', '03202', '03290' )

and 

NATURE_INJURY IN ( '01000', '01300', '01400', '01800',....

August 27th, 2015 4:24pm

CREATE TABLE [ohsdprod].[WCB_CLAIM](
[CLAIM_ID] [numeric](8, 0) NOT NULL,
[FIRM_NO] [varchar](8) NOT NULL,
[SIC_CODE] [varchar](3) NULL,
[GENDER] [varchar](1) NULL,
[BIRTH_DATE] [numeric](8, 0) NULL,
[OCCUPATION_CODE] [varchar](7) NULL,
[YEARS_EXPERIENCE] [numeric](2, 0) NULL,
[EMPLOYMENT_DATE] [varchar](10) NULL,
[BODY_PART] [varchar](10) NULL,
[NATURE_INJURY] [varchar](10) NULL,
[SOURCE_INJURY] [varchar](10) NULL,
[ACCIDENT_TYPE] [varchar](10) NULL,
[OLD_BODY_PART] [numeric](3, 0) NULL,
[OLD_NATURE_INJURY] [numeric](3, 0) NULL,
[OLD_SOURCE_INJURY] [numeric](4, 0) NULL,
[OLD_ACCIDENT_TYPE] [numeric](3, 0) NULL,
[ACCIDENT_DATE] [varchar](10) NULL,
[ACCIDENT_YEAR] [numeric](4, 0) NULL,
[FIRST_PAYMENT_DATE] [numeric](8, 0) NULL,
[ACCIDENT_CAUSE] [varchar](1) NULL,
[UNSAFE_ACT] [varchar](3) NULL,
[WORKSITE] [varchar](60) NULL,
[GEOGRAPHIC_LOCATION] [varchar](60) NULL,
[CUMULATIVE_DAYS_LOST] [numeric](8, 2) NULL,
[CUMULATIVE_TEMP_BENEFITS_COST] [numeric](10, 2) NULL,
[ICD_INJURY_CODE] [varchar](5) NULL,
[STICKMAN_CODE] [varchar](3) NULL,
[RATE_GROUP_CODE] [varchar](3) NULL,
[LANGUAGE_CODE] [varchar](2) NULL,
[CLAIM_TYPE] [varchar](2) NULL,
[ACCIDENT_TIME] [varchar](4) NULL,
[POB] [varchar](10) NULL,
[NATURE] [varchar](10) NULL,
[SOURCE] [varchar](10) NULL,
[EVENT] [numeric](5, 0) NULL,
[NOC] [varchar](7) NULL,
[AGE] [int] NULL
) ON [PRIMARY]

GO
Free Windows Admin Tool Kit Click here and download it now
August 27th, 2015 4:59pm

For all varchar columns you need to use strings, e.g. '1000' when writing IN conditions. Also, your types are not consistent. In this table the SOURCE_INJURY is varchar(10) and in the other table is NVARCHAR(5). It means you're going to have IMPLICIT conversions and bad performance.
August 27th, 2015 5:11pm

I made the change you suggested. But it still does not work.

SELECT 
  LTRIM(FIRM_NO) wsib, 
  convert(date,convert(varchar(10),accident_date,110),110) accident_date, 
  substring((case when
           (SELECT top 1 D.NATURE_CODE FROM OHSDPROD.NATURE D WHERE d.NATURE_CODE  = NATURE_INJURY)= NATURE_INJURY
           then (SELECT top 1 D.NATURE_DESCRIP FROM OHSDPROD.NATURE D where d.NATURE_CODE = NATURE_INJURY)
           else cast(NATURE_INJURY as varchar(50)) end),1,50) NATURE_INJURY,
           
  substring((case when (SELECT top 1 D.SOURCE_CODE FROM OHSDPROD.SOURCE D WHERE 
              D.SOURCE_CODE = source_INJURY ) = source_INJURY
           then (SELECT top 1 D.SOURCE_DESCRIP FROM OHSDPROD.SOURCE D WHERE 
          D.SOURCE_CODE = source_INJURY) else cast(SOURCE_INJURY as varchar(50)) end),1,50) SOURCE_INJURY,
  substring((case when (SELECT top 1 D.ACC_TYPE_CODE FROM OHSDPROD.ACC_TYPE D WHERE 
             D.ACC_TYPE_CODE=Accident_type) = Accident_type
             then (SELECT top 1 D.ACC_TYPE_DESCRIP FROM OHSDPROD.ACC_TYPE D WHERE 
             D.ACC_TYPE_CODE=Accident_type) else cast(ACCIDENT_TYPE as varchar(50)) end ),1,50) ACCIDENT_TYPE, 
  substring((case when (SELECT top 1 D.BODY_CODE FROM OHSDPROD.BODYPART D WHERE 
                     D.BODY_CODE=body_part) = body_part then
            (SELECT top 1 D.BODY_DESCRIP FROM OHSDPROD.BODYPART D WHERE 
             D.BODY_CODE=body_part) else cast(BODY_PART as varchar(50)) end),1,50) BODY_PART,
  substring(( case when (SELECT top 1 D.OCC_CODE FROM OHSDPROD.OCCUPATION D WHERE 
           D.OCC_CODE=occupation_code) = occupation_code then 
          (SELECT top 1 D.OCC_DESCRIP FROM OHSDPROD.OCCUPATION D WHERE 
           D.OCC_CODE=occupation_code) else cast(OCCUPATION_CODE as varchar(50)) end),1,50) OCCUPATION,
  CUMULATIVE_TEMP_BENEFITS_COST COSTS,
  ROUND(datediff(dd,convert(varchar(10),employment_DATE,110), convert(varchar(10),accident_DATE,110)) /30,2) EMPMTHS,
  substring(( case when (SELECT 1 FROM ohsdprod.WCB_CLAIM W2 WHERE W1.CLAIM_ID = W2.CLAIM_ID 
AND NATURE_INJURY = '03500' AND BODY_PART IN ('03200', '03202', '03290')) = 1 then 'SERIOUS'
when 
           (SELECT 1 FROM ohsdprod.WCB_CLAIM W2 WHERE W1.CLAIM_ID = W2.CLAIM_ID 
            AND NATURE_INJURY IN ('01000','01300','01400','01800','01900','03600','05000','05100','05101','05102','05103','05190','05200','05201','05202','05203','05290','05300','05302','05303','05800','06000','06100','06800','06900','07120','07210','07220','07310','07320','07330','08000','08500','08600',
                                  '08901','08902','09300','09400','09500','09510','09520','09710','03800','05301','07230','07240','08900','03110','03700','41110','09100','09100','09200','06200','08400','01200','08300','03100','03190')) = 1 then 'SERIOUS' else ' ' end),1,10) SERIOUS, 
            --Ergo mapping provided by 
  --substring(( case when NATURE_INJURY in (230,381,382,383,384,385,389) then 'ERGO'
  --       when ACCIDENT_TYPE in (81,82,83,85,102,120,121,122,123,129,998,999) then 'ERGO' else ' ' end),1,10) ERGO,
  substring((CASE
WHEN NATURE_INJURY IN
('02001', '02100', '02101', '02102', '02190', '02900', '02901', '02902', '02903', '02904', '02905', '02906', '02907', '02908', '02909', '02910', '02911', '02912', '02913', '02914', '02915', '02916', '02917', '02918', '02919', '02920', '02922', '02923', '08200', '09720', '09730', '12410', '13710','15300', '15310', '15320', '15330','15390', '17000', '17200', '17201', '17202', '17210', '17220', '17230', '17231', '17232', '17233', '17239', '17290', '17291', '17292', '17293','17300','17310', '17320', '17330', '17340', '17350', '17360', '17370', '17390', '17391', '17392', '17393', '17394', '17395', '17400', '17410', '17490', '17900', '17901', '41200', '41230', '41280', '41290', '41480', '41490')
THEN 'ERGO'
WHEN ACCIDENT_TYPE IN 
('20000','21000','21100','21200','21300','21400','21500','21501','21502','21503','21509','21600','21700','21900','22000','22100','22200','22300','22400','22900','22901','23000','23100','23200','23300','23900','24000','25000','26000','27000','29000','29001') 
THEN 'ERGO'
ELSE ' '
END), 1, 10) ERGO,

  --(case when coalesce(BIRTH_DATE,0) <= 17530101 then 0 else 
  --   datediff(dd,convert(datetime,SUBSTRING(cast(birth_date as varchar(8)),1,4) + SUBSTRING(cast(birth_date as varchar(8)),5,2) + 
  --   SUBSTRING(cast(birth_date as varchar(8)),7,2),110),
  --   convert(datetime,SUBSTRING(cast(accident_date as varchar(8)),1,4) + SUBSTRING(cast(accident_date as varchar(8)),5,2) + 
  --   SUBSTRING(cast(accident_date as varchar(8)),7,2),110))/365.25 end) AGE,
  age,
  GENDER,
  --
  --(case when language_code not in ('01','57','58') then 'YES' else ' ' end) FOREIGN_1, 
  (case when language_code not in ('EN','FR') then 'YES' else ' ' end) FOREIGN_1, 
GEOGRAPHIC_LOCATION GEO_LOC,WORKSITE
FROM ohsdprod.WCB_CLAIM W1
where EMPLOYMENT_DATE >  0
 AND ACCIDENT_year > 2006
--Removed the condition based on 
--and coalesce(cumulative_days_lost,0)  > 0
and claim_type = 'LT'

Free Windows Admin Tool Kit Click here and download it now
August 27th, 2015 5:18pm

I take my words back Jingyang. The query has worked. Thanks so much. I will test in the application and advise again.
August 27th, 2015 5:22pm

There are several other problems in this query.

Say, this

convert(date,convert(varchar(10),accident_date,110),110) accident_date, 

is the same as 

accident_date -- if that field is date_time then it will be

cast(accident_date as date) 

All these substring make very little sense. It should be easier to do OUTER APPLY instead, etc.

This query needs to be re-written - it should not be left as is.

Free Windows Admin Tool Kit Click here and download it now
August 27th, 2015 5:46pm

Yes, I agree. The query is a mess. The accident_date field is a varchar(10) field. 

Also, my next problem is that it is using one of the case statements in this query to count the ERGO records. This is the relevant part of a long query:

(SELECT COUNT(substring((CASE
WHEN NATURE_INJURY IN
('02001', '02100', '02101', '02102', '02190', '02900', '02901', '02902', '02903', '02904', '02905', '02906', '02907', '02908', '02909', '02910', '02911', '02912', '02913', '02914', '02915', '02916', '02917', '02918', '02919', '02920', '02922', '02923', '08200', '09720', '09730', '12410', '13710','15300', '15310', '15320', '15330','15390', '17000', '17200', '17201', '17202', '17210', '17220', '17230', '17231', '17232', '17233', '17239', '17290', '17291', '17292', '17293','17300','17310', '17320', '17330', '17340', '17350', '17360', '17370', '17390', '17391', '17392', '17393', '17394', '17395', '17400', '17410', '17490', '17900', '17901', '41200', '41230', '41280', '41290', '41480', '41490')
THEN 'ERGO'
WHEN ACCIDENT_TYPE IN 
('20000','21000','21100','21200','21300','21400','21500','21501','21502','21503','21509','21600','21700','21900','22000','22100','22200','22300','22400','22900','22901','23000','23100','23200','23300','23900','24000','25000','26000','27000','29000','29001') 
THEN 'ERGO'
ELSE ' '
END), 1, 10) )
FROM ohsdprod.wcb_claim C
WHERE ACCIDENT_YEAR > 2006 
AND CLAIM_TYPE = 'LT'
AND C.FIRM_NO = W.FIRM_NO) ERGO

-----------------------------------------------

The problem is that it is also counting the blank columns as ERGO. I think it is because of this portion

 ELSE ' '
END), 1, 10)

When I remove the ELSE portion I get an error: The substring function requires 3 argument(s).

How do I resolve that?

Thanks very much.

August 28th, 2015 11:01am

My apologies. I had removed too many words. It works now.
Free Windows Admin Tool Kit Click here and download it now
August 28th, 2015 11:25am

This also doesn't make sense. Counting word 'ERGO' or '' will be the same. 
August 28th, 2015 11:47am

This topic is archived. No further replies will be accepted.

Other recent topics Other recent topics