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
3 Réponses :
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
Merci @HoneyBadger, problème de copier-coller. ;)
Ce n'est pas nécessairement varchar.
Vous pouvez essayer ceci
SELECT CEILING((AVG(CAST('2061' as Int)))-(AVG(CAST('2061' as Int)))) FROM EMPLOYEES
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.
Nous ne savons pas si la colonne est varchar. SELECT REPLACE (1234.56, 0, '')
fonctionne tel quel sur la décimale (6,2).
Je ne vous laisserais pas calculer mon salaire!
BTW, qu'est-ce que
REPLACE (Salary, 0, '')
est censé faire? Pourquoi un salaire de10101
devrait-il devenir111
?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ées25000
), attendez-vous2500025000
('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.