IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

[SQL2005EXP] La fonction AVG me renvoit des valeurs impossibles


Sujet :

MS SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 41
    Points : 35
    Points
    35
    Par défaut [SQL2005EXP] La fonction AVG me renvoit des valeurs impossibles
    Bonjour,

    Je travaille avec MS SQL Server Express 2005.

    Je cherche a obtenir une moyenne de valeur pou chaque jour du mois. Par exemple, la moyenne des valeurs pour tout les jours du mois de février.

    Pour faire cela, j'ai une table nommée 15_SEC dans ma base de données qui contient, les valeurs de plusieurs variables, la date et l'heure à laquelle la valeur a été enregistrée et le nom de la variable.

    Pour donner une idée à quoi ressemble cette table :




    J'ai aussi une autre table nommée JrM dans laquelle je n'ai que la colonne J qui contient les valeurs:
    1
    2
    3
    4
    .....
    31

    La table JrM fais donc référence aux différents jours d'un mois.

    Donc, ce que je veux faire est sortir pour une variable donnée, la moyenne des valeurs enregistrée à chaque jours du mois. Pour faire cela, j'ai utilisé la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT AVG(CAST(T2.[_VAL] as REAL)) 
    FROM [dbo].[JrM] AS T1 LEFT JOIN 
    (SELECT T.timestamp, T.[_VAL] FROM [dbo].[15_SEC] AS T 
    WHERE [point_id]='FIT_101' AND T.[timestamp] BETWEEN '2010-02-01' AND '2010-02-28') AS T2 
    ON DATEPART(day,T2.[timestamp])=T1.J
    GROUP BY T1.J
    Le problème est que cette requête me renvoit des valeurs NULL pour certains jours où il y a plusieurs valeurs d'enregistrées et la requête me renvoit des valeurs moyenne pour des jours où il n'y a pas encore de données d'enregistrées. Par exemple, pour le 4 février 2010, j'ai NULL comme valeur moyenne alors que toute la journée la valeurs a été 64 et pour le 25 février 2010, et certains autres jours, j'ai une valeurs moyenne de 64 alors qu'il n'y a aucune valeurs d'enregistrée pour cette date ( Ce qui est normal puisque nous ne sommes que le 9 février ).

    J'ai déjà utiliser cette façon de faire pour obtenir des valeurs pour chacune des heures de la journée et pour chacun des jours de la semaine sans problème, mais pour les jours d'un mois il semble y avoir quelque chose d'étrange qui se passe.

    Ce serait grandement apprécié si quelqu'un peut me dire ce qui provoque ce comportement ou encore si quelqu'un a une autre idée pour faire ce que je tente de faire.

    Merci de vos réponses

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 386
    Points
    18 386
    Par défaut
    Je n'arrive pas à reproduire votre problème.
    Vos tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    DECLARE @JrM TABLE (J TINYINT);
     
    With Cte (nm) AS
    (
    select 1
     union all 
    select nm +1
      from Cte
     where nm < 31
    )
    INSERT INTO @JRM (J)
    select nm from Cte;
     
    DECLARE @15_SEC TABLE ([timestamp] datetime, point_id char(7), [_VAL] real);
     
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-01 12:00:00 AM', 'FIT_101', 64);
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-01 12:00:15 AM', 'FIT_101', 64);
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-01 12:00:30 AM', 'FIT_101', 64);
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-01 12:00:45 AM', 'FIT_101', 64);
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-02 12:01:00 AM', 'FIT_101', 64);
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-03 12:01:00 AM', 'FIT_101', 64);
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-04 12:01:00 AM', 'FIT_101', 64);
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-05 12:01:00 AM', 'FIT_101', 64);
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-06 12:01:00 AM', 'FIT_101', 64);
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-07 12:01:00 AM', 'FIT_101', 64);
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-08 12:01:00 AM', 'FIT_101', 64);
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-09 12:01:00 AM', 'FIT_101', 64);
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-10 12:01:00 AM', 'FIT_101', 64);
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-11 12:01:00 AM', 'FIT_101', 64);
    INSERT INTO @15_SEC ([timestamp], point_id, [_VAL]) VALUES ('2010-02-12 12:01:00 AM', 'FIT_101', 64);
    La requête et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
      SELECT T1.J, AVG(CAST(T.[_VAL] AS REAL)) 
        FROM @JRM AS T1
             LEFT OUTER JOIN @15_SEC AS T 
               ON DATEPART(day, T.[timestamp]) = T1.J
              AND [point_id] = 'FIT_101'
              AND T.[timestamp] BETWEEN '2010-02-01' AND '2010-02-28'
    GROUP BY T1.J;
     
    J    
    ---- ----------------------
    1    64
    2    64
    3    64
    4    64
    5    64
    6    64
    7    64
    8    64
    9    64
    10   64
    11   64
    12   64
    13   NULL
    14   NULL
    15   NULL
    16   NULL
    17   NULL
    18   NULL
    19   NULL
    20   NULL
    21   NULL
    22   NULL
    23   NULL
    24   NULL
    25   NULL
    26   NULL
    27   NULL
    28   NULL
    29   NULL
    30   NULL
    31   NULL

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 41
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    Merci pour ta réponse,

    j'ai essayer ce que tu as écris et effectivement ça marche très bien.

    J'ai aussi essayer d'utiliser exactement ta requete avec mes tables et cela me retourne les mêmes résultats erronnés. Je crois que le problème viens de ma table JrM puisque si je remplace la table @JRM dans ta requete par ma table, j'obtiens les mêmes résultats bizarres. Mais si je garde la table @JRM dans la requete et que je remplace la table @15_SEC par ma table 15_SEC dans la requête, j'obtiens les bons résultats.

    Je trouve cela étrange, est-ce que ça pourrait être le type de données que j'ai utilisé lorsque j'ai créé ma table JrM qui causerait cela? Je l'ai créé avec le type NUMERIC(18,0) et je viens d'essayer avec un type de données différents et les résultats ont changés. Je vais essayer de trouver le bon type et je reviens la-dessus.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2007
    Messages : 41
    Points : 35
    Points
    35
    Par défaut
    Rebonjour,

    J'ai essayer de changer le data type de ma table JrM pour le mettre à tinyint comme dans ton exemple, mais ça ne semblait pas fonctionner. J'ai donc essayer de recréer une nouvelle table JrM avec le data type tinyint et ça fonctionne très bien.

    N'empeche que je trouve ca étrange que même si je change le type de ma table JrM originale pour tinyint les résultats sont mauvais et si je crée une nouvelle table identique avec le type tinyint ça fonctionne parfaitement. Mais bon l'important est que ça fonctionne héhé.

    Merci beaucoup pour l'aide

    À un prochain problème

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/04/2011, 12h15
  2. Réponses: 3
    Dernier message: 19/03/2008, 22h11
  3. Réponses: 2
    Dernier message: 18/12/2006, 00h37
  4. Fonction permettant d'afficher des valeurs
    Par Shakta dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 28/06/2006, 12h01
  5. fonction sur la somme des valeurs issues d'une requete
    Par iam dans le forum Bases de données
    Réponses: 5
    Dernier message: 15/06/2006, 21h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo