3
votes

Conversion personnalisée de la valeur décimale en SQL

Je dois personnaliser une valeur de colonne spécifique d'une requête. où j'ai quatre types de cas comme

AbsentDays = case 
                when AbsentDays = 0.00 
                   then convert(int, AbsentDays) 
                when AbsentDays >= 1.00 
                   then convert(decimal(10, 1), AbsentDays)
                -- when AbsentDays = 0.50 
                --    then 0.5
            end

et ma sortie attendue serait comme

  1       0
  6       0.5
  2       1
  3       1.5
  4       2
  5       2.5

Pour ce faire, j'ai essayé ceci écrit ci-dessous

  empcode AbsentDays
  1       0.00
  6       0.50
  2       1.00
  3       1.50
  4       2.00
  5       2.50

Mais en utilisant cela, je ne peux pas obtenir le résultat souhaité, cela remplace d'autres valeurs.


2 commentaires

Pour une colonne, vous ne pouvez avoir qu'un seul type de données, idéalement, vous devriez le faire dans l'interface utilisateur ou changer le type en varchar


+1 sur l'interface utilisateur pour le faire; mais mauvaise idée sur le varchar . Stocker des décimales sous forme de varchar ne sera rien d'autre qu'une douleur à l'avenir.


3 Réponses :


0
votes

Vous pouvez le faire en le convertissant en float car les zéros les plus à droite après la virgule décimale sont coupés en float :

select empcode, cast(AbsentDays as float)
from tbl


9 commentaires

@ArnaudPeralta Non, ce n'est pas le cas. Quel SGBD utilisez-vous? Dans SSMS, ce n'est pas comme ça.


C'était un exemple, mais float est mauvais en général dans la base de données. Vous trouverez facilement quelques exemples.


@ArnaudPeralta Veuillez fournir un exemple valide lorsque vous essayez de réfuter une réponse. Je viens de lancer 0,5 pour flotter et le résultat était de 0,5


Essayez ceci: SELECT FORMAT (CAST (15.12 AS FLOAT), 'g17') . C'est étrange de justifier le fait qu'un flotteur n'est pas précis ...


Je n'ai rien mentionné sur la fonction format que vous utilisez. Essayez simplement SELECT CAST (15.12 AS FLOAT) et voyez que cela ne se produit pas.


J'utilise le format pour éviter l'arrondi du serveur sql, avec cela, nous pouvons voir que les données sont modifiées, et ce n'est pas ce que l'op demandait. Personne dans la base de données n'utilise la valeur flottante, il y a une raison.


J'ai juste essayé SELECT CAST (5.1223423532530 AS FLOAT) et rien n'a été arrondi!


Parce que l'arrondi est sur un nombre significatif.


Merci pour la discussion. C'est merveilleux d'apprendre une nouvelle chose.



1
votes

Ne lancez pas comme un flottant, vous perdrez en précision.

SELECT FORMAT(CAST(2.0 AS DECIMAL(9,6)), 'g15') -- will print 2
SELECT FORMAT(CAST(0.50 AS DECIMAL(9,6)), 'g15') -- will print 0.5


1 commentaires

Notez que format () est disponible à partir de SQL Server 2012.



2
votes

Une colonne ne peut avoir qu'un seul type de données. Afin de voir les différents cas de la manière que vous décrivez, vous devrez utiliser un type de données varchar / nvarchar :

AbsentDays = case 
                when AbsentDays = floor(AbsentDays)
                   then convert(nvarchar(max),convert(int, AbsentDays)) -- change to int if no decimal part
                else convert(nvarchar(max),convert(decimal(10, 1), AbsentDays)) -- else return one decimal
              end

p >


3 commentaires

Je voterais pour, mais vous utilisez un type de caractère et n'incluez pas la longueur.


Et n'ignorons pas l'utilisation déroutante du "type de données texte" alors que "type de données chaîne" aurait été un meilleur choix - parce que TEXT est un type de données.


Très observateur, je n'y suis pas très habitué, merci. Je modifierai en conséquence.