1. #1
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    juillet 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : juillet 2017
    Messages : 2
    Points : 3
    Points
    3

    Par défaut Select sur une table + procedure stockée

    Bonjour,

    Je suis sur Firebird 2.5

    Je souhaite faire la moyenne glissante d'une colonne QT sur les 3 dernières dates inf ou égal DateDiff

    La table contient 3 colonnes :
    Code, DateDiff, QT
    15 02.01.2014 25
    15 03.01.2014 135
    15 04.01.2014 35
    15 07.01.2014 19
    15 09.01.2014 39
    15 10.01.2014 50
    15 13.01.2014 40
    15 14.01.2014 54

    J'ai une procédure stockée qui réalise le calcul de la moyenne, elle fonctionne.

    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
    ALTER PROCEDURE AVG_3JOURS_QT (
        DATEJOUR Date )
    RETURNS (
        AVG_QT Integer )
    AS
    BEGIN
      for
       SELECT AVG(QT) from
        (SELECT QT
         FROM DIFF a
         WHERE Code = '15'
         and DATEDIFF <= :DATEJOUR
         order by Datediff desc
         ROWS 1 to 3)
       into :AVG_QT do
      suspend;
    END^
    Je souhaite faire appel à la procédure, pour obtenir pour chaque datediff la moyenne sur 3 jours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT a.DateDiff, a.QT, p.AVG_QT
    FROM DIFF a, AVG_3JOURS_QT(a.DateDiff) p
    J'obtiens ce message d'erreur : "no current record for fecth operation"

    Alors que je m'attends à ça :

    DateDiff, QT AVG_QT
    02.01.2014 25 25 = AVG(25,0,0)
    03.01.2014 135 80 = AVG(135,25,0)
    04.01.2014 35 65 = AVG(35,135,25)
    07.01.2014 19 63 = AVG(19,35,135)
    09.01.2014 39 31 = AVG(39,19,35)
    10.01.2014 50 36 = AVG(50,39,19)
    13.01.2014 40 43 = AVG(40,50,39)
    14.01.2014 54 48 = AVG(54,40,50)

    Pouvez-vous m'aider ?
    Merci

  2. #2
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2007
    Messages
    8 553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2007
    Messages : 8 553
    Points : 19 959
    Points
    19 959
    Billets dans le blog
    4

    Par défaut

    Citation Envoyé par Fredo_26 Voir le message
    Je souhaite faire appel à la procédure, pour obtenir pour chaque datediff la moyenne sur 3 jours

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT a.DateDiff, a.QT, p.AVG_QT
    FROM DIFF a, AVG_3JOURS_QT(a.DateDiff) p
    Bonjour,
    Vous faites une jointure (mal écrite d'ailleurs selon la norme vous devriez utiliser a JOIN b ON ) mais vous n'indiquez pas quel lien (s'il y en a un) est fait entre les deux tables !

    Il y a AMHA une erreur de logique

    je pense que vous voulez plutôt faire quelque chose comme ceci (non testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    EXECUTE BLOCK RETURNS (ADATE DATE, AQTE INTEGER, MOYENNE INTEGER)
    AS
    BEGIN
     FOR SELECT DATEDIFF,QT FROM DIF INTO :ADATE,:AQTE 
      DO BEGIN
        SELECT AVG_QTE FROM AVG_3JOURS_QT(:ADATE) INTO :MOYENNE;
        SUSPEND;
      END
    END
    La seule chose absolue dans un monde comme le nôtre, c'est l'humour. » Albert Einstein
    J'entends et j'oublie. Je vois et je me souviens. Je fais et je comprends . Confucius
    Si votre seul outil est un marteau, vous aurez tendance a ne voir que des clous

  3. #3
    Candidat au Club
    Homme Profil pro
    Technicien réseau
    Inscrit en
    juillet 2017
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : Technicien réseau
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : juillet 2017
    Messages : 2
    Points : 3
    Points
    3

    Par défaut

    Merci SergioMaster.

    A la base je pensais réussir à la faire uniquement en syntaxe Select, mais je me suis vite rendu compte que pour faire la moyenne glissante il me fallait un traitement externe.

    Avec votre proposition, je peux tous faire dans la procédure stockée, c'est finalement plus simple.

    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
    CREATE PROCEDURE AVG_3_QT
    RETURNS (
        ADATE Date,
        AQTE Integer,
        MOYENNE Integer )
    AS
    BEGIN
     FOR SELECT DATEDIFF,QT FROM DIFF WHERE CODE = '15'
         INTO :ADATE, :AQTE 
     
     DO BEGIN
      SELECT AVG_QT FROM AVG_3JOURS_QT(:ADATE) INTO :MOYENNE;
      SUSPEND;
     END 
    END^
    SELECT * FROM AVG_3_QT me renvoie exactement ce que je veux.

    Encore Merci.

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

Discussions similaires

  1. Select sur une table intermédiaire
    Par Okena dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/07/2008, 14h14
  2. [Droits] INSERT et SELECT sur une table temporaire
    Par Bisûnûrs dans le forum Administration
    Réponses: 2
    Dernier message: 19/06/2008, 09h01
  3. Les résultats d'un Select sur une table
    Par naznaz dans le forum Bases de données
    Réponses: 1
    Dernier message: 04/11/2007, 12h58
  4. Réponses: 6
    Dernier message: 08/02/2007, 15h41
  5. selection sur une table en fonction de plusieurs ligne
    Par dimdidi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/12/2004, 09h42

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