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 :

Insérer une colonne virtuelle compteur dans une requête


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    Technicien ERP
    Inscrit en
    Mars 2014
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien ERP

    Informations forums :
    Inscription : Mars 2014
    Messages : 106
    Points : 91
    Points
    91
    Par défaut Insérer une colonne virtuelle compteur dans une requête
    Bonjour,
    Dans une requête je souhaite récupérer plusieurs informations d'une table comportant des données clients. Jusque là, facile par un Select.
    Je souhaite également compter le nombre de factures par client sur une table facture
    Facile par un select count (distinct group byCe que je n'arrive pas à faire, c'est lier les deux requêtes.
    Quelqu'un peut-il m'aider ?
    Pour info mes deux requêtes sont :

    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
    SELECT 
    "CLIENT"."Code" AS "Code EBP", 
    "CLIENT"."Code" AS "Code SYNOP", 
    UPPER ( REPLACE ( REPLACE ( REPLACE ( RTRIM ( "CLIENT"."RaisonSociale" ) , '.' , '') ,'*' ,'') , ' ' , '_')) AS "Libelle", 
    '16/04/2014' AS "Date Crea", 
    "CLIENT"."Compte" AS "Code Compta", 
    "CLIENT"."NumTVA" AS "TVA", 
    "CLIENT"."Siret" AS "Siret", 
    SUBSTRING ( "Siret", 0 , 9) AS "Siren", 
    "CLIENT"."Contact10_Email" AS "Mail", 
    "CLIENT"."Contact10_URL" AS "Web", 
    '2014' AS "Tarif", 
    "CLIENT"."Reglement" AS "Conf Reg", 
    'A Définir' AS "Groupe", 
    'A définir' AS "Activité", 
    'A Définir' AS "Origine", 
    'A Définir' AS "PME:GROU" 
    FROM 
    "CLIENT"
    Et la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT COUNT(DISTINCT "FACTURE"."Facture") FROM "FACTURE" WHERE "FACTURE"."Facture" <> '0' GROUP BY "Facture"."Client"
    J'ai essayé d'ajouter la seconde requête dans le select de la première avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (SELECT COUNT(DISTINCT "FACTURE"."Facture") FROM "FACTURE" WHERE "FACTURE"."Facture" <> '0' GROUP BY "Facture"."Client") AS "NbFacture"
    Mais ça ne fonctionne pas.
    J'ai essayé de créer une vue avec la seconde requête pour appeler le résultat du nombre de factures par une liaison simple mais ça ne fonctionne pas non plus.
    Mon niveau de SQL a ses limites.

    Merci de votre aide !

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    Il faut faire une jointure entre la table client et la table facture:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select client.code,count(*)
    from client
    inner join facture.client = client.code
    group by client.code

    Tatayo.

  3. #3
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    bonjour,


    il faut passer par une jointure (externe) entre vos deux requêtes.

  4. #4
    Membre régulier
    Homme Profil pro
    Technicien ERP
    Inscrit en
    Mars 2014
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien ERP

    Informations forums :
    Inscription : Mars 2014
    Messages : 106
    Points : 91
    Points
    91
    Par défaut
    Bonjour,

    Merci beaucoup pour votre aide.

    en lançant votre requête, j'ai le message suivant :

    ODBC Error: SQLSTATE = 37000, Native error code = 0
    Syntax Error: SELECT client.code,count(*)
    FROM client
    INNER JOIN facture.client << ??? >>= client.code
    GROUP BY client.code
    Merci d'avance

  5. #5
    Membre régulier
    Homme Profil pro
    Technicien ERP
    Inscrit en
    Mars 2014
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien ERP

    Informations forums :
    Inscription : Mars 2014
    Messages : 106
    Points : 91
    Points
    91
    Par défaut
    Désole pour mon très léger niveau en SQL je débute.
    J'ai en effet regardé quelques explications sur les jointures externes mais n'ai pas compris.

  6. #6
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 23
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Une jointure externe te permet de lier ta table Client avec la table Facture via un identifiant qui est stocké dans les deux tables. Par exemple Client.clientid et Facture.clientid.

    La jointure externe retourne tous les Clients filtrés par la clause WHERE, ainsi que les factures qui leur sont liées (si un client n'as pas de facture, il sera tout-de-même retourné par la requête).

  7. #7
    Membre régulier
    Homme Profil pro
    Technicien ERP
    Inscrit en
    Mars 2014
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien ERP

    Informations forums :
    Inscription : Mars 2014
    Messages : 106
    Points : 91
    Points
    91
    Par défaut
    Bonjour,

    Merci pour cet éclaircissement mais je ne comprends toujours pas la différence entre la jointure effectuée par la clause Where et celle de la jointure externe ?

    Si je suis trop nul pour ce forum d'expert, n’hésitez pas à le dire lol

  8. #8
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 23
    Points : 46
    Points
    46
    Par défaut
    Cela pourrait répondre à ton besoin:

    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
    SELECT 
    	"CLIENT"."Code" AS "Code EBP", 
    	"CLIENT"."Code" AS "Code SYNOP", 
    	UPPER ( REPLACE ( REPLACE ( REPLACE ( RTRIM ( "CLIENT"."RaisonSociale" ) , '.' , '') ,'*' ,'') , ' ' , '_')) AS "Libelle", 
    	'16/04/2014' AS "Date Crea", 
    	"CLIENT"."Compte" AS "Code Compta", 
    	"CLIENT"."NumTVA" AS "TVA", 
    	"CLIENT"."Siret" AS "Siret", 
    	SUBSTRING ( "Siret", 0 , 9) AS "Siren", 
    	"CLIENT"."Contact10_Email" AS "Mail", 
    	"CLIENT"."Contact10_URL" AS "Web", 
    	'2014' AS "Tarif", 
    	"CLIENT"."Reglement" AS "Conf Reg", 
    	'A Définir' AS "Groupe", 
    	'A définir' AS "Activité", 
    	'A Définir' AS "Origine", 
    	'A Définir' AS "PME:GROU",
    	COUNT("FACTURE"."Facture") OVER(PARTITION BY "CLIENT"."CLIENT") AS "NbFacture"
    FROM  "CLIENT"
    	LEFT OUTER JOIN "FACTURE"
    		ON "CLIENT"."CLIENT" = "CLIENT"."CLIENT"
                    AND "FACTURE"."Facture" <> '0'
    Ne connaissant pas la structure de tes tables Client et Factures, je ne sais pas sur quelles colonnes tu dois faire ta jointure.
    Il faut donc que tu adaptes la clause ON de la jointure.

    Pour ce qui est de récupérer le nombre de factures, je te conseille d'utiliser la fonction fenêtré COUNT() OVER(PARTITION BY).
    Cela te permet d'éviter une nouvelle jointure pour récupérer les informations.

  9. #9
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2014
    Messages
    23
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2014
    Messages : 23
    Points : 46
    Points
    46
    Par défaut
    Citation Envoyé par Timkeeper Voir le message
    Merci pour cet éclaircissement mais je ne comprends toujours pas la différence entre la jointure effectuée par la clause Where et celle de la jointure externe ?
    Je te recommande de prendre quelques minutes pour faire un peu de lecture sur les jointures.

    La clause WHERE ne fait pas de jointures, elle sert à filtrer le jeu de données qui sera retourné par ta requête.
    Cette clause évalue un prédicat pour chaque ligne de ta table. Si l'évaluation de ce prédicat vaut TRUE, alors la ligne évaluée est retournée.

  10. #10
    Membre régulier
    Homme Profil pro
    Technicien ERP
    Inscrit en
    Mars 2014
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Technicien ERP

    Informations forums :
    Inscription : Mars 2014
    Messages : 106
    Points : 91
    Points
    91
    Par défaut
    Bonjour a tous

    Je fais un peu de ménage sur ce poste qui reste ouvert.
    Merci pour les conseils, le gère un peu mieux les notions de jointures maintenant.

    Mon problème n'est pas directement résolu mais je ne pourrais pas aller beaucoup plus loin de par les restriction de mon interpréteur (Pervasive SQL V8) Que je ne peux pas upgrader sinon il n'est plus compatible avec l'application. Cet interpréteur me limite beaucoup dans les conditions ou requêtes imbriquées.

    Je le note donc en résolu car il est inutile de creuser.

    Je tenais a vraiment vous remercier pour votre "ecoute" et vos conseils qui m'ont permis d’évoluer sur les requêtes.

    Cordialement

  11. #11
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 001
    Points : 30 905
    Points
    30 905
    Billets dans le blog
    16
    Par défaut
    Bonsoir,


    Citation Envoyé par Timkeeper
    Je fais un peu de ménage sur ce poste qui reste ouvert.
    Prenons l’exemple suivant :

    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
     
     
    use tempdb ;
     
    create table client
    (
           codeclient      integer      not null
         , compte          integer      not null  
       , CONSTRAINT client_PK PRIMARY KEY (codeclient)
    ) ;
     
    create table facture
    (
           codeclient       integer      not null
         , NumeroFacture    integer      not null 
       , CONSTRAINT facture_PK PRIMARY KEY (NumeroFacture)
       , CONSTRAINT facture_client_FK FOREIGN KEY (codeclient) 
           REFERENCES client(codeclient)
    ) ;
     
    insert into client (codeclient, compte) values (1, 12345) ;
    insert into client (codeclient, compte) values (2, 23456) ;
    insert into client (codeclient, compte) values (3, 34567) ;
     
    insert into facture (codeclient, NumeroFacture) values (1, 10001) ;
    insert into facture (codeclient, NumeroFacture) values (1, 10002) ;
    insert into facture (codeclient, NumeroFacture) values (1, 10003) ;
     
    insert into facture (codeclient, NumeroFacture) values (2, 20001) ;
    insert into facture (codeclient, NumeroFacture) values (2, 20002) ;
    insert into facture (codeclient, NumeroFacture) values (2, 20003) ;
    insert into facture (codeclient, NumeroFacture) values (2, 20004) ;
    Pour avoir le nombre de factures par client, ok pour la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select codeclient, count(*) as nbFactures
    from facture
    group by codeclient ;
    De ce SELECT vous faites une expression de table, qui en vertu de la fermeture ensembliste est une table (appelons-la T), donc manipulable avec les opérateurs relationnels, dont la jointure :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select x.codeClient, compte, coalesce (nbFactures, 0) as nbFactures
    from   client as x left outer join (select codeclient, count(*) as nbFactures
                                        from facture
                                        group by codeclient) as T
                     on x.codeClient = T.codeClient
    ;
    Au résultat :

    
    codeclient    compte    NbFactures
    ==========    ======    ==========
             1    12345              3
             2    23456              4
             3    34567              0
    
    
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

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

Discussions similaires

  1. [phpMyAdmin] comment insérer une colonne not null dans une table ?
    Par Ragnart dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 31/05/2014, 21h00
  2. Réponses: 1
    Dernier message: 26/12/2010, 21h20
  3. insérer une liste de valeurs dans une colonne
    Par ecdxml dans le forum SQL
    Réponses: 7
    Dernier message: 16/10/2009, 15h57
  4. Masquer une ligne selon resultat dans une colonne
    Par amne26 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/10/2008, 23h45
  5. Réponses: 2
    Dernier message: 31/01/2008, 17h58

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