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

Langage SQL Discussion :

[InterBase 6] Aide Requete SQL


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 6
    Points
    6
    Par défaut [InterBase 6] Aide Requete SQL
    Bonjour ,

    Soit la table des DEVIS d'une PME composée des champs suivants :
    Client
    Montant_propose
    Etat (Etat du devis 0: encours,1: Accepte, 2: Refuse)

    Comment puis je retourner en une fois les infos suivantes pour chaque CLIENT
    concerne :
    - La somme des montants_proposes à l'etat 0
    - La somme des montants_proposes à l'etat 1
    - La somme des montants_proposes à l'etat 2
    - Le nombre de devis à l'etat 0
    - Le nombre de devis à l'etat 1
    - Le nombre de devis à l'etat 2

    Voici ce que j'ai essaye :

    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
     select
     
    cgde020,
     
    (select sum(montprop) from TDE001 where TDE001.cgde020=cgde020
    and cgde130=0 and  cgde050='30003') as Encours,
     
    (select sum(montprop) from TDE001 where TDE001.cgde020=cgde020
    and cgde130=1 and  cgde050='30003') as Accepte,
     
    (select sum(montprop) from TDE001 where TDE001.cgde020=cgde020
    and cgde130=2 and  cgde050='30003')  as Refuse,
     
    (select count(cgde130) from TDE001 where TDE001.cgde020=cgde020
    and cgde130=0 and  cgde050='30003') as NbrEncours,
     
    (select count(cgde130) from TDE001 where TDE001.cgde020=cgde020
    and cgde130=1 and  cgde050='30003') as NbrAccepte,
     
    (select count(cgde130) from TDE001 where TDE001.cgde020=cgde020
    and cgde130=2 and  cgde050='30003') as NbrRefuse,
     
     
    (select count(cgde130) from TDE001 where TDE001.cgde020=cgde020 and  cgde050='30003') as Total
     
     
    from TDE001
     
    where cgde050='30003'

    Ceci ne fonctionne pas ! Toutes les valeurs sont identiques !

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 392
    Points
    28 392
    Par défaut
    C'est une simple requête de regroupement par client et etat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Client, Etat, COUNT(*) as Nombre, SUM(Montant) as Total
    FROM   Devis
    GROUP BY Client, Etat
    ;
    Après c'est une histoire de présentation, ce n'est plus du SQL comme il est dit ici

  3. #3
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    Est-ce que CASE WHEN est dispo sous INTERBASE 6 ?

  4. #4
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 39
    Points : 37
    Points
    37
    Par défaut
    Votre problème vient du fait que vous avez un SELECT dans la liste d'un autre SELECT, et ça me semble ambiguu à résoudre.

    Je ne connais InterBase, mais je vous propose la solution suivante qui marche sous Oracle :

    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
    SELECT
    cgde020, T1.Ecours, T2.Accepte, T3.Refuse, ......
    FROM 
    (select sum(montprop) as Encours from TDE001 where TDE001.cgde020=cgde020
    and cgde130=0 and cgde050='30003') T1,
    
    (select sum(montprop) as Accepte from TDE001 where TDE001.cgde020=cgde020
    and cgde130=1 and cgde050='30003') T2,
    
    (select sum(montprop) as Refuse from TDE001 where TDE001.cgde020=cgde020
    and cgde130=2 and cgde050='30003') T3 ,
    
    ......,
    
    TDE001
    
    WHERE cgde050='30003'

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Le probleme est de ne ramener qu'une seule ligne pour chaque client.
    Exemple:

    Client1|Montant Total des devis à l'etat 0 | Montant Total des devis à l'etat 1 Montant Total des devis à l'etat 2 | Nombre de devis à l'etat 0 | Nombre de devis à l'etat 1 | Nombre de devis à l'etat 2

    Je n'ai qu'une seule table qui contient toutes ces données. D'ou la difficulté.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Novembre 2003
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Novembre 2003
    Messages : 39
    Points : 37
    Points
    37
    Par défaut
    La requête proposée 2 posts plus haut retourne bien une seule ligne.

  7. #7
    Inactif   Avatar de Médiat
    Inscrit en
    Décembre 2003
    Messages
    1 946
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 946
    Points : 2 227
    Points
    2 227
    Par défaut
    cyrilleT>> Si tu ne réponds pas aux questions que l'on te pose, il ne faudra pas t'étonner de ne pas avoir de réponse !

  8. #8
    Futur Membre du Club
    Inscrit en
    Février 2006
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    CASE WHEN ne répond pas et je ne peux pas mettre de SELECT derrière un FROM.


  9. #9
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 392
    Points
    28 392
    Par défaut
    Citation Envoyé par cyrilleT
    CASE WHEN ne répond pas et je ne peux pas mettre de SELECT derrière un FROM.
    Tu peux peut-être passer par des vues pour remplacer les SELECT dans le FROM

  10. #10
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 102
    Points : 28 392
    Points
    28 392
    Par défaut
    Une autre manière de le calculer :
    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
    SELECT  Total.cgde020
      , SUM(Encours.montprop)   AS SumEncours
      , SUM(Accepte.montprop)   AS SumAccepte
      , SUM(Refuse.montprop)    AS SumRefuse
      , COUNT(Encours.cgde130)  AS NbrEncours
      , COUNT(Accepte.cgde130)  AS NbrAccepte
      , COUNT(Refuse.cgde130)   AS NbrRefuse
      , SUM(Total.montprop)     AS SumTotal
      , COUNT(Total.cgde130)    AS NbrTotal
    FROM  TDE001 AS Total
      LEFT JOIN  TDE001  AS  Encours
        ON  Total.cgde020 = Encours.cgde020
        AND Total.cgde050 = Encours.cgde050
      LEFT JOIN  TDE001  AS  Accepte
        ON  Total.cgde020 = Accepte.cgde020
        AND Total.cgde050 = Accepte.cgde050
      LEFT JOIN  TDE001  AS  Refuse
        ON  Total.cgde020 = Refuse.cgde020
        AND Total.cgde050 = Refuse.cgde050
    WHERE Encours.cgde130 = 0
      AND Accepte.cgde130 = 1
      AND Refuse.cgde130  = 2
      AND Total.cgde050   = '30003'
    GROUP BY  Total.cgde020
            , Total.cgde050
    ;

Discussions similaires

  1. aide requete sql
    Par viny dans le forum Langage SQL
    Réponses: 4
    Dernier message: 10/08/2006, 15h13
  2. aide requete sql access 2000
    Par bab69 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 13/05/2006, 20h56
  3. Aide requete SQL ou fonction VBA
    Par nykola7 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 08/03/2006, 17h51
  4. Besoin d'aide requete sql
    Par dinde dans le forum Langage SQL
    Réponses: 1
    Dernier message: 12/10/2005, 09h09
  5. [Aide requete SQL]
    Par viny dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 22/04/2005, 17h00

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