0
votes

SQL Server: somme de colonne avec des valeurs alphanumériques

Je veux obtenir la somme d'une colonne alphanumérique. Je veux ajouter des valeurs numériques et renvoyer des valeurs de colonne s'il n'est pas numérique. Ce que j'ai fait est un cas d'ajout un lorsque qui ressemble à ce xxx

donc je suppose que toutes les valeurs numériques seront ajoutées et si les valeurs sont dans ( 'Cl', 'HS', 'HV', 'ML', 'SL', 'VL', 'VL', 'HC', 'S', 'S', '*') Il sera retourné tel quel.

mais je reçois

Erreur lors de la conversion de type de données NvarchaRar en numérique.


2 commentaires

Tagez votre question avec la base de données que vous utilisez. Les échantillons de données et les résultats souhaités aideraient également.


@Gordonlinoff mise à jour


3 Réponses :


0
votes

Ceci ressemble à la syntaxe SQL Server. Je recommanderais d'utiliser try_convert () : xxx


3 commentaires

Voulez-vous revenir comme valeur SI NON NUMÉRIQUE SIGNIFIÈME Retour ('Cl', 'HS', 'HV', 'ML', 'SL', 'VL', 'S' ',' " ) est-ce possible


@guradio. . . Je ne comprends pas la logique. Voulez-vous un numéro ou une chaîne comme valeur de retour? Les échantillons de données et les résultats souhaités dans la question aideraient.


Je veux que le résultat soit la somme de la valeur numérique si elle est numérique si elle n'est pas numérique puis renvoyer la valeur actuelle (que nous ayons l'une des valeurs du ( ("CL '," HS "," ML " , 'SL', 'vl', 'hc', 's', '*') )



2
votes

On dirait que votre agrégation de somme est hors de propos. Vous ne devez que si la condition dans la déclaration de cas est vraie. Essayez ceci:

select
    cast(SUM(cast(intAllocatedResourceperDivision as decimal(18,2))) as varchar)
from
    YOUR_TABLE
where
    ISNUMERIC(intAllocatedResourceperDivision) = 1

UNION ALL

select
    intAllocatedResourceperDivision
from
    YOUR_TABLE
where
    ISNUMERIC(intAllocatedResourceperDivision) = 0


2 commentaires

vouloir revenir tel quel est la valeur si pas le sens numérique retour ("CL '," HS "," HV "," ML "," SL "," VL "," HC "," * ") Est-ce possibiliser


Il est possible d'une approche différente. Vous devez diviser les données en 2 jeux de données différents (numériques et non numériques), effectuer l'agrégation, puis combiner les deux jeux de données ensemble à nouveau. J'ai mis à jour ma réponse pour également refléter cela.



0
votes

Essayez ceci:

select 'CL' as intAllocatedResourceperDivision into #tmp
union select 'HS'union select 'HV'union select 'ML'union select 'SL'union select 'VL'union select 'HC'union select 'S'union select '*'union select '1'union select '4'

select CAST(SUM(ISNULL(CAST(intAllocatedResourceperDivision AS DECIMAL),0.00)) AS nvarchar(250)) as intAllocatedResourceperDivision
from #tmp where intAllocatedResourceperDivision NOT IN ('CL','HS','HV','ML','SL','VL','HC','S','*')
union 
select intAllocatedResourceperDivision
from #tmp where intAllocatedResourceperDivision IN ('CL','HS','HV','ML','SL','VL','HC','S','*')


1 commentaires

vouloir revenir tel quel est la valeur si pas le sens numérique retour ("CL '," HS "," HV "," ML "," SL "," VL "," HC "," * ") Est-ce possibiliser