2017-08-23 50 views
0

J'ai une table qui comprend une colonne VARCHAR peuplée avec des valeurs commeErreur de conversion varchar de type de données à numérique lors de la conversion sous-chaîne en décimal

employé n'a pas droit au SSP parce que leurs gains hebdomadaires moyens sont inférieurs LEL.Average bénéfices : £ 44,13750

enter image description here

Je suis en train d'extraire la valeur après le signe £ donc j'ai essayé:

SELECT 
    ClientId 
    , Max(PayPeriod) As PeriodNo 
, CASE WHEN MAX(Comment) like '%£%' THEN 
    CAST(MAX(right(Comment, charindex('£', reverse(Comment))-1))AS DECIMAL(5,2)) 
    ELSE 0 END AS AvgEarnings2  
FROM 
    t_PayrollSSPEmployeeComment 
WHERE 
    comment like '%LEL%' AND comment like '%£%' 
     GROUP BY 
      ClientID 

Je veux seulement récupérer la valeur que je puisse le lancer en décimal comme 110.25

Mais je reçois une erreur

Error converting data type varchar to numeric. 

Je peux obtenir la valeur avec ou sans le signe £, mais j'ai besoin de le convertir au bon nombre de décimales pour un rapport. Qu'est-ce que je fais mal ici?

+1

Il semble que vous ayez des caractères non autorisés dans la valeur de chaîne. Peut-être votre point décimal? – ssn

Répondre

1

Pouvez-vous essayer cela, la fonction SUBSTRING peut être utilisée pour extraire nombre après caractère £.

SELECT 
    ClientId 
    ,Max(PayPeriod) As PeriodNo 
    ,CASE WHEN MAX(Comment) like '%£%' THEN  
    CAST(SUBSTRING(MAX(Comment),2,LEN(MAX(Comment))) AS DECIMAL(18,2)) 
     ELSE 0 END AS AvgEarnings2  
    FROM t_PayrollSSPEmployeeComment 
    WHERE comment like '%LEL%' AND comment like '%£%' 
    GROUP BY ClientID 
+0

Merci, mais maintenant j'ai une erreur 'Erreur de débordement arithmétique convertissant varchar en type de données numérique.' –

+0

@OurManinBananas Pouvez-vous essayer avec 'DECIMAL (18,2)' réponse mise à jour, j'espère que votre colonne de commentaire n'a pas d'autre caractère que "£". –

+0

J'ai essayé cela, même erreur, donc devra vérifier la chaîne plus attentivement, dépouillant tout comme saut de ligne et ainsi de suite –

1

Si vous utilisez SQL Server 2012 ou supérieur, utilisez la fonction Try_Convert:

Try_Convert (Decimal(5, 2), MAX(right(Comment, charindex('£', reverse(Comment))-1))) 

et de voir, partout où votre code d'erreur ne convertit pas l'expression type décimal, au lieu d'une erreur, le résultat sera null et vérifiez le problème avec cette valeur.