web-dev-qa-db-fra.com

Comment récupérer des décimales lors de l'arrondi d'une moyenne en SQL

Voici mon instruction SQL

SELECT ROUND(AVG(column_name), 100) 
FROM [database].[dbo].[table]

La réponse que je récupère est 3 avec une plage de nombres possible entre 1 - 5 en 908 lignes.

J'en ai besoin pour dire 3.0 ou 3.09. Est-ce possible?

36
Skullomania

La moyenne aura le même type de données que les valeurs, alors convertissez les valeurs:

SELECT ROUND(AVG(CAST(column_name AS FLOAT)), 2) FROM [database].[dbo].[table]
97
Guffa

Je ne sais pas si cela vous aidera à skullomania, mais essayez ceci

    SELECT CAST(AVG(CAST(column_name as DECIMAL(10,2))) AS DECIMAL(10,2))FROM [table_name]

Le flottant est une approximation, la décimale, d'autre part, le rendra plus exact, vous voudrez peut-être lire les mathématiques et les décimales des flotteurs. J'ai d'abord eu du mal avec cela et je me sens toujours perdu parfois. J'espère que cela vous aidera.

EN C # je ne sais pas si je peux avoir des ennuis pour poster la réponse ici, mais avez-vous essayé de la convertir en double et d'utiliser une ExecuteScalar()

essaye ça:

    protected void Page_Load(object sender, EventArgs e)
    {
     SqlConnection conn= sqlconnectionstring;
     SqlCommand cmd = new SQLCommand("SELECT STATEMENT",conn);
     cmd.CommandType = CommandType.Text;
     conn.Open();
     Double result = Convert.ToDouble(cmd.ExecuteScalar());
     lblresult.text = "the result is " + result;
     conn.Dispose();
     cmd.Dispose();
    }
5
user1374985

Je ne suis pas tout à fait sûr de ce que vous demandez, mais je pense que vous voulez que le nombre soit retourné avec une précision supplémentaire.

Vous encapsulez l'appel dans la fonction RONDE , mais si le type de données de votre colonne n'a pas de précision supérieure à 0 (par exemple int), vous aurez besoin pour CAST ou CONVERTIR les données en un autre type en premier.

Voici quelques exemples qui illustrent plusieurs façons de CONVERTIR données en différents types:

SELECT CAST(100 AS decimal(5, 2)) -- Gives you "100.00"
      ,CAST(100 AS float) --<== Gives you "100"
      ,CAST(100.0 AS float) --<== Gives you "100"
      ,CAST(100.01 AS float) --<== Gives you "100.01"

Consultez également MSDN: types de données (Transact-SQL) .

3
Alexander

Vous n'avez même pas besoin de faire un ROUND là-bas, vraiment. Vous pouvez simplement convertir vos valeurs en DECIMAL, comme ceci:

SELECT AVG(CONVERT(DECIMAL(16,2),YourColumn)) 
FROM YourTable
3
Lamak
CAST(AVG(column_name) AS DECIMAL(5, 2))

C'est montrer 100 comme 100,00 et 100,05 comme 100,05

0
Vikas Sharma