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

SQL Firebird Discussion :

Requête plus ou moins compliquée pour moi


Sujet :

SQL Firebird

  1. #1
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut Requête plus ou moins compliquée pour moi
    Salut communauté !

    à la base j'ai cette requête :
    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
    select
              d.nom_unite,
              count (e.code_commune ),
              sum( e.lineaire_total)/1000,
              sum( a.lineaire_cure),
              sum( a.volume_collecte)
     
        from tb_curage a
            inner join tb_commune b on (a.code_commune = b.code_commune)
            inner join tb_centre c on (b.code_centre = c.code_centre)
            inner join tb_unite d on (c.code_unite = d.code_unite)
            inner join tb_commune_pop_lin e on (a.code_commune = e.code_commune)
     
     
        where
        (
          ( (a.date_curage between :date_debut and :date_fin) and
          Extract(year from a.date_curage) = e.annee_de_comparaison )
        )
     
        group by d.nom_unite
    mais c'est pas ce que je veux exactement
    dans les colonnes 2 et 3 je voudrais avoir le nombre de ligne du dernier mois quelque soit la période de référence, est-il possible de les avoir dans la même requête ?

    Merci par avance.

  2. #2
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Re,

    j'ai essayé avec une requête imbriquée mais j'ai eu un message d'erreur.
    voici la requête :
    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
    select
              d.nom_unite,
     
              ( select 
                count( * ) nb_communes
                from tb_curage
                inner join tb_commune on (tb_curage.code_commune = tb_commune.code_commune)
                inner join tb_centre on (tb_commune.code_centre = tb_centre.code_centre)
                inner join tb_unite on (tb_centre.code_unite = tb_unite.code_unite)
                where
                (
                    (tb_curage.date_curage = :date_fin)
                )
                group by tb_unite.nom_unite ),
     
              sum(  e.lineaire_total)/1000,
              sum( a.lineaire_cure),
              sum( a.volume_collecte)
     
        from tb_curage a
            inner join tb_commune b on (a.code_commune = b.code_commune)
            inner join tb_centre c on (b.code_centre = c.code_centre)
            inner join tb_unite d on (c.code_unite = d.code_unite)
            inner join tb_commune_pop_lin e on (a.code_commune = e.code_commune)
     
     
        where
        (
          ( (a.date_curage between :date_debut and :date_fin) and
          Extract(year from a.date_curage) = e.annee_de_comparaison )
        )
     
        group by d.nom_unite
    le message d'erreur est :
    multiple rows in singleton select
    c'est dû au group by de la requête imbriquée, quand je l'enlève ça donne pas le résultat escompté et en le laissant j'ai cette erreur. comment contourner ce problème ?

  3. #3
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Points
    1 414
    Par défaut
    salut

    tu as repéré le problème :
    la sous-requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ( SELECT 
                count( * ) nb_communes
                FROM tb_curage
                INNER JOIN tb_commune ON (tb_curage.code_commune = tb_commune.code_commune)
                INNER JOIN tb_centre ON (tb_commune.code_centre = tb_centre.code_centre)
                INNER JOIN tb_unite ON (tb_centre.code_unite = tb_unite.code_unite)
                WHERE
                (
                    (tb_curage.date_curage = :date_fin)
                )
                GROUP BY tb_unite.nom_unite )
    ne doit envoyer qu'une seule ligne. hors avec le GROUP BY ce n'est pas sure.

    Il faut mettre ce GROUP BY dans la requête principale (ce qui est déjà le cas). Mais juste une WHERE


    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
    SELECT
              d.nom_unite,
     
              ( SELECT 
                count( * ) nb_communes
                FROM tb_curage
                INNER JOIN tb_commune ON (tb_curage.code_commune = tb_commune.code_commune)
                INNER JOIN tb_centre ON (tb_commune.code_centre = tb_centre.code_centre)
                INNER JOIN tb_unite ON (tb_centre.code_unite = tb_unite.code_unite)
                WHERE
                (
                    (tb_curage.date_curage = :date_fin) AND tb_unite.nom_unite = d.nom_unite
                )
                ),
     
              sum(  e.lineaire_total)/1000,
              sum( a.lineaire_cure),
              sum( a.volume_collecte)
     
        FROM tb_curage a
            INNER JOIN tb_commune b ON (a.code_commune = b.code_commune)
            INNER JOIN tb_centre c ON (b.code_centre = c.code_centre)
            INNER JOIN tb_unite d ON (c.code_unite = d.code_unite)
            INNER JOIN tb_commune_pop_lin e ON (a.code_commune = e.code_commune)
     
     
        WHERE
        (
          ( (a.date_curage BETWEEN :date_debut AND :date_fin) AND
          Extract(year FROM a.date_curage) = e.annee_de_comparaison )
        )
     
        GROUP BY d.nom_unite,  tb_unite.nom_unite

  4. #4
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Merci mon ami c'était ça en effet.

  5. #5
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Re,

    dans la même requête j'ai une colonne que je calcul ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            /* calcul du linéaire totale */
            ( select 
                    sum( ( lineaire_total )/1000 ) LIN_TOTAL_km
                    from tb_commune_pop_lin
                    /* liste des jointures de la 2ième requête imbriquée */
                    inner join tb_commune on (tb_commune_pop_lin.code_commune = tb_commune.code_commune)
                    inner join tb_centre on (tb_commune.code_centre = tb_centre.code_centre)
                    inner join tb_unite on (tb_centre.code_unite = tb_unite.code_unite)
                    where 
                    (
                        ( tb_commune_pop_lin.annee_de_comparaison = Extract(year from :date_fin) )
                        and tb_unite.nom_unite = d.nom_unite
                    )
            ),
    j'ai une variable date_fin mais je voudrais dans le where ne prendre que l'année depuis cette variable pour la comparer au champ "annee_de_comparaison", le compilateur me signale cette erreur :
    Invalid String.
    Dynamic SQL Error.
    SQL error code = -105.
    Specified EXTRACT part does not exist in input datatype.
    que je comprends par: la fonction "extract" n'est spécifiée qu'aux champs pas aux variable. comment, selon vous, puis-je régler ce petit pépin ?

  6. #6
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Points
    1 414
    Par défaut
    as tu vérifié le format de la colonne :
    tb_commune_pop_lin.annee_de_comparaison
    ?

    penses au CAST pour avoir le même type de format
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CAST(Extract(year FROM :date_fin) AS ????)

  7. #7
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    la colonne "annee_comparaison" est de type varchar.
    j'ai mis un cast comme suggérer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tb_commune_pop_lin.annee_de_comparaison = cast(Extract(year from :date_fin) as varchar(4))
    mais j'ai toujours cette erreur

  8. #8
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Points
    1 414
    Par défaut
    Et quel est le type de Date_Fin ?

    parce que si ce n'est pas un champs "Date"....

  9. #9
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    et comment savoir le type d'une variable dans une requête ?!
    je crois avoir lu quelque part que les variables d'une requêtes sont par défaut de type varchar, est-ce exact ?

  10. #10
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 157
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 157
    Points : 1 414
    Points
    1 414
    Par défaut
    Non pas du tout, il dépend du contexte de la requête.

    Dans une PS, c'est déterminé dans la déclaration de la variable.
    Dans delphi, on définit le type dans l'envoi des paramètres.


    Pour être sur, tu peux caster la variable en lui affectant explicitement le type INTEGER

  11. #11
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 576
    Points
    576
    Par défaut
    Citation Envoyé par Just-Soft Voir le message
    et comment savoir le type d'une variable dans une requête ?!
    je crois avoir lu quelque part que les variables d'une requêtes sont par défaut de type varchar, est-ce exact ?
    T'est sérieux là ? c'est toi qui a le code source de la PS est t'est pas au "courant" des types de variables utilisées ?
    Faudrait pas tirer trop sur la corde, elle risque de casser.

  12. #12
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Citation Envoyé par TryExceptEnd Voir le message
    T'est sérieux là ? c'est toi qui a le code source de la PS est t'est pas au "courant" des types de variables utilisées ?
    Faudrait pas tirer trop sur la corde, elle risque de casser.
    merci pour la remarque gratuite mais je crois jamais avoir utiliser le mot PS !
    c'est une requête simple pas une PS, donc pas la peine de rafler n'importe où et n'importe comment.

    NB : je suis très sérieux, oui

  13. #13
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 576
    Points
    576
    Par défaut
    Citation Envoyé par Just-Soft Voir le message
    merci pour la remarque gratuite mais je crois jamais avoir utiliser le mot PS !
    c'est une requête simple pas une PS, donc pas la peine de rafler n'importe où et n'importe comment.

    NB : je suis très sérieux, oui
    PS ou pas PS c'est toi qui définie le type de la variable, donc ma remarque aussi gratuite soit-elle est valable et elle n’était pas destinée a offenser.

  14. #14
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Citation Envoyé par TryExceptEnd Voir le message
    PS ou pas PS c'est toi qui définie le type de la variable, donc ma remarque aussi gratuite soit-elle est valable et elle n’était pas destinée a offenser.
    ok merci, j'ai donné le code dans mon 1er post j'aimerais bien savoir où dois-je définir ma variable car honnêtement je ne sais pas dans quelle partie du code SQL ça se définie ?

  15. #15
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 576
    Points
    576
    Par défaut
    Si tu as écrit ta requête dans un composant (Delphi ?) celui-ci a sûrement une propriété "Params" ou équivalente où tu retrouveras tes paramètres et là tu définis pour chacun son type par la propriété "DataType" ou équivalente.

  16. #16
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Merci TryExceptEnd mais tu ne me suis pas ! si j'avais un problème avec Delphi je l'aurais poster sur les forums delphi !! depuis tout le début je ne cesse de parler de SQL indépendamment du langage haut niveau que je vais utilisé plus tard.

    L'erreur obtenue signifie que la fonction Extract du code SQL n'est appliquée que pour les champs or moi j'ai voulu l'utilisé sur une variable. donc, en d'autres termes comment puis-je passé uniquement l'année sachant que ma variable elle comporte la date toute entière ?

  17. #17
    Membre confirmé Avatar de TryExceptEnd
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    501
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 501
    Points : 576
    Points
    576
    Par défaut
    Désolé, mais c'est vrai j'ai sauté quelques lignes.
    Comme Firebird ne connait pas le type de la variable, il suffit de le lui spécifier par un CAST.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tb_commune_pop_lin.annee_de_comparaison = CAST(EXTRACT(YEAR FROM CAST(:date_fin AS DATE)) AS VARCHAR(4))

  18. #18
    Membre émérite
    Homme Profil pro
    Directeur technique
    Inscrit en
    Mai 2008
    Messages
    2 401
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 401
    Points : 2 310
    Points
    2 310
    Par défaut
    Citation Envoyé par TryExceptEnd Voir le message
    Désolé, mais c'est vrai j'ai sauté quelques lignes.
    Comme Firebird ne connait pas le type de la variable, il suffit de le lui spécifier par un CAST.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tb_commune_pop_lin.annee_de_comparaison = CAST(EXTRACT(YEAR FROM CAST(:date_fin AS DATE)) AS VARCHAR(4))
    j'avais pris cette piste mais j'avais fais qu'un seul cast alors que l'astuce était de faire un double caste pour :
    1. forcer date_fin à être de type date
    2. convertir en varchar

    merci TryExceptEnd

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

Discussions similaires

  1. une requête multiple trop compliquée pour moi
    Par Invité dans le forum Requêtes
    Réponses: 1
    Dernier message: 24/08/2010, 22h38
  2. Requête SQL trop compliquée pour moi
    Par goldenboy68 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 10/04/2008, 14h50
  3. Requête peut être simple, mais compliquée pour moi !
    Par xfree dans le forum Langage SQL
    Réponses: 11
    Dernier message: 17/08/2007, 16h09
  4. Une requête bien compliquée pour moi
    Par bellande dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 01/02/2007, 21h51
  5. Requête un peu trop compliqué pour moi
    Par Kokito dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/04/2005, 15h17

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