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 304
    Points
    2 304
    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.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  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 304
    Points
    2 304
    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 ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

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

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    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
    Merci d'ajouter un sur les tags qui vous ont aidé

  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 304
    Points
    2 304
    Par défaut
    Merci mon ami c'était ça en effet.
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  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 304
    Points
    2 304
    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 ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

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

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    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 ????)
    Merci d'ajouter un sur les tags qui vous ont aidé

  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 304
    Points
    2 304
    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
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

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

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

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

    parce que si ce n'est pas un champs "Date"....
    Merci d'ajouter un sur les tags qui vous ont aidé

  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 304
    Points
    2 304
    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 ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

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

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    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
    Merci d'ajouter un sur les tags qui vous ont aidé

  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 : 574
    Points
    574
    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.
    Si vous êtes libre, choisissez le Logiciel Libre.

  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 304
    Points
    2 304
    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
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  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 : 574
    Points
    574
    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.
    Si vous êtes libre, choisissez le Logiciel Libre.

  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 304
    Points
    2 304
    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 ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  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 : 574
    Points
    574
    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.
    Si vous êtes libre, choisissez le Logiciel Libre.

  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 304
    Points
    2 304
    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 ?
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

  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 : 574
    Points
    574
    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))
    Si vous êtes libre, choisissez le Logiciel Libre.

  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 304
    Points
    2 304
    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
    Bon courage ou Bonne Chance (selon le contexte)
    Mon blog sur WordPress

+ 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