1
votes

comment réparer ce Msg 8117, niveau 16, état 1, serveur WIN-ILO9GLLB9J0, ligne 2 Le type de données d'opérande varchar n'est pas valide pour l'opérateur avg

Je résous un défi de classement de hacker et je suis coincé avec une erreur

Msg 8117, niveau 16, état 1, serveur WIN-ILO9GLLB9J0, ligne 2
Le type de données d'opérande varchar n'est pas valide pour l'opérateur avg.

veuillez suggérer les chnages

J'ai essayé d'écrire cette requête

SELECT CEILING((AVG(Salary))-(AVG(REPLACE(Salary,0,'')))) FROM EMPLOYEES

2061


5 commentaires

Je ne vous laisserais pas calculer mon salaire!


BTW, qu'est-ce que REPLACE (Salary, 0, '') est censé faire? Pourquoi un salaire de 10101 devrait-il devenir 111 ?


Pourquoi stockez-vous le salaire en tant que varchar et non en tant que type de données numériques? Si vous additionnez les salaires de 2 personnes (disons qu'elles sont toutes deux payées 25000 ), attendez-vous 2500025000 ( '25000' + '25000' = '2500025000'! = 50000 )? C'est une très belle enveloppe salariale. :RÉ


Consultez ma réponse et remplacez la valeur par la colonne Salaire.


car c'est une sorte de «défi». Je suppose que la conception a été donnée comme une sorte d'exercice pour voir si elle peut être résolue avec des `` hacks '' - n'est qu'une théorie.


3 Réponses :


0
votes

Votre colonne Salaire est varchar, doit être de type numérique.

SELECT CEILING((AVG(CAST (Salary AS DECIMAL (10,2))))-(AVG(CAST (Salary AS DECIMAL (10,2))))) FROM EMPLOYEES


2 commentaires

Merci @HoneyBadger, problème de copier-coller. ;)


Ce n'est pas nécessairement varchar.



0
votes

Vous pouvez essayer ceci

SELECT CEILING((AVG(CAST('2061' as Int)))-(AVG(CAST('2061' as Int)))) FROM EMPLOYEES


0 commentaires

1
votes

Je pense que la "vraie" réponse ici est de corriger votre type de données. Vous pouvez ainsi utiliser la syntaxe ALTER :

ALTER TABLE dbo.EMPLOYEES ALTER COLUMN Salary decimal(18,2); --Assumed dbo schema

Vous pouvez utiliser un type de données différent de decimal (18,2) , mais cela vous donne la syntaxe de base.

Ensuite, une expression simple comme AVG (Salary) ne générera pas d'erreur indiquant que Salary est le mauvais type de données pour l'opérateur.


1 commentaires

Nous ne savons pas si la colonne est varchar. SELECT REPLACE (1234.56, 0, '') fonctionne tel quel sur la décimale (6,2).