Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre Expert
    Homme Profil pro AbdelHakim Kellouche
    Inscrit en
    mai 2008
    Messages
    2 088
    Détails du profil
    Informations personnelles :
    Nom : Homme AbdelHakim Kellouche
    Localisation : Algérie

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : mai 2008
    Messages : 2 088
    Points : 1 973
    Points
    1 973

    Par défaut Utilisation de lignes dans un résultat

    Salut

    j'ai le code suivant qui rend le bon résultat attendu :
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT tb_step.nom_step,
        tb_point_prlv.designation_ouvrage,
        tb_matiere_seche.mat_seche FROM tb_step
     
    INNER JOIN tb_matiere_seche ON (tb_matiere_seche.code_step = tb_step.code_step)
    INNER JOIN tb_point_prlv ON (tb_point_prlv.code_point_prlv = tb_matiere_seche.code_point_prlv)
     
    WHERE (tb_matiere_seche.date_bilan BETWEEN :d_debut AND :d_fin
    AND tb_matiere_seche.code_point_prlv IN (3,4))
    comme résultat, pour la date du 30/09/2012 que je prends comme exemple, j'ai 4 lignes. A présent, je dois utiliser le résultats des lignes 1 et 2 dans une expression telle que
    Code :
    (Ratio = val_ligne1_champ3/(val_ligne2_champ3-val_ligne1_champ3)
    le problème c'est que je dois prendre les valeurs des lignes qui se succèdent mais pas de la même ligne (ligne 1 et 2, 3 et 4 ....)

    j'ai pensé à inclure un for each mais j'ai pas su où mettre ce bout de code ?!
    je pense que je dois prendre le résultat de la requête et travailler dessus mais j'ai aucune idée sur la méthode à suivre.

    merci par avance.
    Bon courage ou Bonne Chance (selon le contexte)

  2. #2
    Membre Expert
    Homme Profil pro AbdelHakim Kellouche
    Inscrit en
    mai 2008
    Messages
    2 088
    Détails du profil
    Informations personnelles :
    Nom : Homme AbdelHakim Kellouche
    Localisation : Algérie

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : mai 2008
    Messages : 2 088
    Points : 1 973
    Points
    1 973

    Par défaut Résolution par CTE

    Salut !
    en cherchant par ici et là, j'ai finis par tombé sur un vieux tutoriel Requêtes récursives avec les CTE - Exemples avec SQLServer 2003
    qui m'a vraiment beaucoup aidé à revoir la solution d'un autre œil. A vrai dire, j'aurais dû penser à la récursivité mais comme j'ai jamais songé qu'il y'avait moyen de l'utiliser dans du SQL j'ai omis cette piste par ignorance.

    J'ai pas encore validé le résultat final mais j'aimerais quand même partager ce code SQL avec vous, je souhaiterais l'optimiser ou l'améliorer, merci encore les amis.

    Code :
    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
    /* Utilisation d'une CTE (expression de table commune) */
    WITH
        /* calcul de la moyenne de l'indice de boue dans le bassin d'aération */
        Compte_Moyenne_IB_BA (step, ouvrage, moy_ib)
        AS
            (SELECT b.nom_step, c.designation_ouvrage, avg(a.indice_boue)
            FROM tb_indice_boue a
                INNER JOIN tb_step b ON (b.code_step = a.code_step)
                INNER JOIN tb_point_prlv c ON (c.code_point_prlv = a.code_point_prlv)
            WHERE ( (a.date_bilan BETWEEN :d_debut AND :d_fin) AND
                    c.code_point_prlv = 3 /* code bassin d'aération */)
            GROUP BY b.nom_step, c.designation_ouvrage
            ),
     
        /* calcul de la moyenne de l'indice de boue dans le clarificateur */
        Compte_Moyenne_IB_CL (step, ouvrage, moy_cl)
        AS
            (SELECT b.nom_step, c.designation_ouvrage, avg(a.indice_boue)
            FROM tb_indice_boue a
                INNER JOIN tb_step b ON (b.code_step = a.code_step)
                INNER JOIN tb_point_prlv c ON (c.code_point_prlv = a.code_point_prlv)
            WHERE ( (a.date_bilan BETWEEN :d_debut AND :d_fin) AND
                    c.code_point_prlv = 8 /* code clarificateur */)
            GROUP BY b.nom_step, c.designation_ouvrage
            )
     
    SELECT  /* affichage du nom de la STEP */
            Compte_Moyenne_IB_BA.step,
            /* affichage du Ratio */
            (cast(Compte_Moyenne_IB_BA.moy_ib AS float)/Compte_Moyenne_IB_CL.moy_cl) Ratio_IB
    FROM Compte_Moyenne_IB_CL, Compte_Moyenne_IB_BA
    WHERE ( Compte_Moyenne_IB_BA.STEP  = Compte_Moyenne_IB_CL.STEP )
    Bon courage ou Bonne Chance (selon le contexte)

  3. #3
    Expert Confirmé

    Homme Profil pro Philippe Makowski
    Consultant spécialité Firebird
    Inscrit en
    mai 2002
    Messages
    2 308
    Détails du profil
    Informations personnelles :
    Nom : Homme Philippe Makowski
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant spécialité Firebird
    Secteur : Conseil

    Informations forums :
    Inscription : mai 2002
    Messages : 2 308
    Points : 3 294
    Points
    3 294

    Par défaut

    sauf que cela n'a rien de récursif
    Philippe Makowski
    IBPhoenix - Firebird
    Membre de l'April

  4. #4
    Membre Expert
    Homme Profil pro AbdelHakim Kellouche
    Inscrit en
    mai 2008
    Messages
    2 088
    Détails du profil
    Informations personnelles :
    Nom : Homme AbdelHakim Kellouche
    Localisation : Algérie

    Informations professionnelles :
    Secteur : Service public

    Informations forums :
    Inscription : mai 2008
    Messages : 2 088
    Points : 1 973
    Points
    1 973

    Par défaut

    Citation Envoyé par makowski Voir le message
    sauf que cela n'a rien de récursif
    Salut

    exact, fallait juste préciser que j'ai rééditer le terme tel quel de l'article cité, sinon je n'ai fais qu'utilisé la CTE
    Bon courage ou Bonne Chance (selon le contexte)

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •