Précédent   Forum des professionnels en informatique > Bases de données > Firebird > SQL
SQL Forum d'entraide sur le SQL pour Firebird
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/07/2011, 09h36   #1
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
Par défaut Requête plus ou moins compliquée pour moi

Salut communauté !

à la base j'ai cette requête :
Code :
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/07/2011, 12h39   #2
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
Re,

j'ai essayé avec une requête imbriquée mais j'ai eu un message d'erreur.
voici la requête :
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
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 :
Citation:
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 10h09   #3
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
salut

tu as repéré le problème :
la sous-requête
Code :
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 :
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
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 14h42   #4
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
Merci mon ami c'était ça en effet.
__________________
Bon courage ou Bonne Chance (selon le contexte)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 18h04   #5
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
Re,

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

Code :
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 :
Citation:
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 18h11   #6
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
as tu vérifié le format de la colonne :
Citation:
tb_commune_pop_lin.annee_de_comparaison
?

penses au CAST pour avoir le même type de format
Code :
CAST(Extract(year FROM :date_fin) AS ????)
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/07/2011, 18h22   #7
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
la colonne "annee_comparaison" est de type varchar.
j'ai mis un cast comme suggérer
Code :
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 09h34   #8
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
Et quel est le type de Date_Fin ?

parce que si ce n'est pas un champs "Date"....
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 13h40   #9
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 14h01   #10
Membre émérite
 
Homme Olivier Dehorter
Ingenieur de recherche - Ecologue
Inscription : juin 2003
Messages : 697
Détails du profil
Informations personnelles :
Nom : Homme Olivier Dehorter
Localisation : France

Informations professionnelles :
Activité : Ingenieur de recherche - Ecologue

Informations forums :
Inscription : juin 2003
Messages : 697
Points : 837
Points : 837
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
dehorter olivier est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 14h19   #11
Membre éclairé
 
Avatar de TryExceptEnd
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 435
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 : 435
Points : 347
Points : 347
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.
TryExceptEnd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 15h13   #12
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 19h21   #13
Membre éclairé
 
Avatar de TryExceptEnd
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 435
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 : 435
Points : 347
Points : 347
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.
TryExceptEnd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 21h30   #14
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 21h58   #15
Membre éclairé
 
Avatar de TryExceptEnd
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 435
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 : 435
Points : 347
Points : 347
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.
TryExceptEnd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/07/2011, 23h24   #16
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2011, 00h50   #17
Membre éclairé
 
Avatar de TryExceptEnd
 
Homme
Développeur informatique
Inscription : octobre 2006
Messages : 435
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 : 435
Points : 347
Points : 347
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 :
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.
TryExceptEnd est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/07/2011, 01h04   #18
Membre Expert
 
Homme AbdelHakim Kellouche
Inscription : mai 2008
Messages : 1 977
Détails du profil
Informations personnelles :
Nom : Homme AbdelHakim Kellouche
Localisation : Algérie

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mai 2008
Messages : 1 977
Points : 2 126
Points : 2 126
Envoyer un message via MSN à Just-Soft Envoyer un message via Skype™ à Just-Soft
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 :
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)
Just-Soft est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h33.


 
 
 
 
Partenaires

Hébergement Web