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 :

Problème avec SELECT MAX


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 16
    Points
    16
    Par défaut Problème avec SELECT MAX
    Bonjour, j'ai un problème avec ma requête SELECT MAX qui doit taper sur deux tables, et elle ne marche pas la voici;

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(numfacture) AS maxi FROM facture,clients WHERE datefacture BETWEEN '2008-01-01' AND '2008-01-31' AND clients.refnumsoc='1'
    qu'est ce qui ne va pas?

    Merci

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Il te manque une jointure entre les deux tables !
    Pas évident à voir avec ta requête pas vrai ?
    Alors adopte la bonne syntaxe pour les jointures :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT a.col1, b.col2
    FROM a
    INNER JOIN b ON a.id = b.id
    Ce qui donne dans ton cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT MAX(f.numfacture) AS maxi
    FROM facture f
    INNER JOIN clients c ON f.[colonne de clé étrangère représentant le client dans la table facture] = c.refnumsoc 
    WHERE f.datefacture BETWEEN '2008-01-01' AND '2008-01-31'
    AND c.[colonne du nom du client] = [nom du client]
    Si tu fais la restriction (clause WHERE de la requête) directement sur le numéro du client, il n'y a plus besoin de la jointure et donc plus besoin de la table clients.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 16
    Points
    16
    Par défaut
    Non ce n'est pas bon, désoler je me suis mal exprimé. Je doit gardé mon refnumsoc car dans les clients, il y a en deux sorte, il y en a qui appartiennent à une société et d'autres a une autre société, je me réfère comme sa. Le principe est que je dois avoir un numéro de facture qui part de 0 au début de chaque moi et qui s'incrémente au fur et à mesure, donc sa j'y arrive pas de soucis, mais le soucis c'est que je dois séparé les deux, exemple

    Société 1:
    facture N° 1
    facture N° 2
    facture N° 3


    Société 2:
    facture N° 1
    facture N° 2
    facture N° 3


    et pas les deux confondus, tu peux m'aider sa sera sympa, Merci.

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Donne la structure de tes tables qu'on y voie un peu plus clair.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 16
    Points
    16
    Par défaut
    Voila mes deux tables:

    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    CREATE TABLE `clients` (
      `numclient` int(10) NOT NULL auto_increment,
      `numcat` int(3) unsigned default '1',
      `numville` int(6) unsigned default NULL,
      `codeclient` varchar(11) default NULL,
      `typeclient` int(3) default NULL,
      `groupeclient` tinyint(3) unsigned default NULL,
      `nomsoc` varchar(150) default NULL,
      `adresse` varchar(150) default NULL,
      `telephone` varchar(20) default NULL,
      `tel2` varchar(20) default NULL,
      `tel3` varchar(20) default NULL,
      `fax` varchar(20) default NULL,
      `titre` varchar(20) default NULL,
      `url` varchar(50) default NULL,
      `email` varchar(100) default NULL,
      `paiement` int(3) unsigned default '0',
      `commentaires` mediumtext,
      `valide` tinyint(1) unsigned default '1',
      `exempfacture` int(5) default NULL,
      `numintracomm` varchar(30) default NULL,
      `refsociete` varchar(30) default NULL,
      `refnumsoc` int(5) default NULL,
      PRIMARY KEY  (`numclient`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;
     
     
     
     
    CREATE TABLE `facture` (
      `numid` int(6) unsigned NOT NULL auto_increment,
      `datefacture` date default NULL,
      `numfacture` int(6) unsigned default NULL,
      `numclient` int(5) unsigned default NULL,
      `codeclient` varchar(10) default NULL,
      `adresse` mediumtext,
      `tva` float(5,2) default NULL,
      `total` float(10,2) default NULL,
      `paiement` tinytext,
      `termine` tinyint(1) unsigned default '0',
      `regle` tinyint(1) unsigned default '0',
      `dateregle` date default NULL,
      `adateecheance` date default '0000-00-00',
      `modepaiement` varchar(30) default NULL,
      PRIMARY KEY  (`numid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;



    Voila, merci

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    1) Tu n'as pas besoin de répéter le codeclient dans la table factures puisque tu peux l'obtenir par jointure entre les deux tables.
    Tu peux te poser aussi la question pour 'adresse'. Je vois que cette colonne n'a pas le même type dans les deux colonnes. On peut supposer qu'il s'agit dans le second cas de l'adresse de facturation qui peut être différente de l'adresse du client. Tu pourrais externaliser les adresses dans une table séparée afin de les typer et récupérer la bonne adresse par jointure.

    2) Compliqué ton système de numérotation de facture !
    Le principe est que je dois avoir un numéro de facture qui part de 0 au début de chaque mois et qui s'incrémente au fur et à mesure
    Par contre j'ai pas trop compris ça :
    dans les clients, il y a en deux sorte, il y en a qui appartiennent à une société et d'autres a une autre société
    Je vois dans la table 'clients' que ce sont des sociétés. Alors les clients qui appartiennent à une société ou à une autre, je ne pige pas !
    A quoi correspondent refsociete et refnumsoc dans la table clients ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 16
    Points
    16
    Par défaut
    Dans ma table clients 'nomsoc' est le nom du clients en faites.
    Tu peux oublier refsociete. En fait il y a deux entreprise qui travaillent sur la bases, j'ai les deux dans une tables:
    1 machin
    2 Bidulle

    Donc dans refnumsoc j'ai le numid des ces entreprises. Et c'est en fonction de ces entreprises que je me réfère pour le numéro de facturation. Il n'y faut pas une numérotation qui se suit pour les deux. Elles doivent avoir deux séparée comme je l'ai expliqué plus haut.

  8. #8
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Essaie ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT MAX(f.numfacture) AS maxi
    FROM facture f
    INNER JOIN clients c ON f.numclient = c.numclient
    WHERE f.datefacture BETWEEN '2008-01-01' AND '2008-01-31'
    AND c.refnumsoc = 1
    Ou alors j'ai toujours pas compris ta structure bizarre et/ou ton besoin.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  9. #9
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 16
    Points
    16
    Par défaut
    Non sa ne marche pas ta requête.

    Je vais expliquer le tout. En fait je travail sur un intranet.Sur cette intranet il y a deux entreprises qui s'en servent.donc les clients et facture et tout sont dans la même base de données. Pour différencier tout sa, j'ai une table qui rassemble c'est deux sociétés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE TABLE `refsociete` (
      `numid` int(2) unsigned NOT NULL auto_increment,
      `nomsociete` varchar(30) NOT NULL default '',
      `valide` int(1) default '1',
      PRIMARY KEY  (`numid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

    Dans ma table client, pour différencier les clients d'une entreprise de l'autre, j'ai un champ refnumsoc qui correspond au numid de la table refsociete. Pour la facturation, chaque facture doit avoir un numéro. Le principe est que à chaque début de mois ce numéro reviens à 0. Seulement le numéro doit être différent entre les entreprises qui font la facture, je m'explique:

    il ne faut pas que:
    facture 1 =>entreprise 1
    facture 2 =>entreprise 2
    facture 3 =>entreprise 2
    facture 4 =>entreprise 1
    etc...

    ce qu'il faut:

    facture 1 =>entreprise 1 facture 1 =>entreprise 2
    facture 2 =>entreprise 1 facture 2 =>entreprise 2
    facture 3 =>entreprise 1 facture 3 =>entreprise 2
    facture 4 =>entreprise 1 facture 4 =>entreprise 2


    il ne faut pas que les numéros de facture soit confondus entre les deux entreprises. Pour cela dans ma table client j'ai le refnumsoc qui me permet de savoir à qui appartient le client soit entreprise 1 soit la 2. Et bien sur je me repère avec le date pour le numéro de facture, mais sa pas de soucis.

    Cela paraît clair ? C'est vrai que c'est pas évident quand on est pas dedans, pour moi je comprend tout à fait le besoin.

  10. #10
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Et en quoi ma requête ne fonctionne t-elle pas par rapport à ton besoin ?
    Selon moi elle devrait te donner le plus grand numéro de facture de la refsoc 1 au mois de janvier 2008.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  11. #11
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 16
    Points
    16
    Par défaut
    Non elle ne marche pas, sa me donne toujours 1

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Ben peut-être que tu n'as fait qu'une facture au mois de janvier pour le refsoc 1 ?
    Ou bien que toutes les factures du mois de janvier sont nuémrotée 1 et que c'est ton appli de facturation qui a un bug.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  13. #13
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 16
    Points
    16
    Par défaut
    Non sa je suis sur que j'ai plus d'une facture pour les 2 entreprises. Et je sais qu'elles sont bien numérotées car je l'ai voient, elles vont de 1 à 48.Sa vient bien de la requête

  14. #14
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    La requete de CinePhil semble correcte, pouvez vous poster un jeu d'essai de vos tables ?
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  15. #15
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 16
    Points
    16
    Par défaut
    un jeu d'essai? C'est à dire? je connais un peu les BDD mais pas ce mot , pouvez vous m'expliquez? Merci

  16. #16
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    les scripts d'insertion de vos données afin de pouvoir tester
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  17. #17
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 16
    Points
    16
    Par défaut
    C'est à dire ? désolé je suis pas très fort. vous voulez une partie des mes données des 2 tables, c'est sa?

  18. #18
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Salut,

    Je suppose après avoir relu le post, et adapté la requête de CinePhil
    que ce que tu veux, c'est le MAX du n° de facture pour chaque société :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT c.refnumsoc, MAX(f.numfacture) AS maxi
      FROM facture f
           INNER JOIN clients c ON f.numclient = c.numclient
     WHERE f.datefacture BETWEEN '2008-01-01' AND '2008-01-31'
     GROUP BY c.refnumsoc
    Si ce n'est toujours pas ça, merci de détailler le besoin.

    Ce qu'on appelle un jeu d'essai, c'est :
    - un script de création de tables
    - un script d'Insert

    Le tout ne doit pas forcément être extrait de ta BDD mais on doit pouvoir reproduire ton problème dessus, et toi ça te sert à illustrer.
    "Ce que l'on conçoit bien s'énonce clairement,
    Et les mots pour le dire arrivent aisément." Nicolas Boileau

    "Expliquer empêche de comprendre si cela dispense de chercher"

    Quiz Oracle : venez tester vos connaissances !

    La FAQ Oracle : 138 réponses à vos questions
    Aidez-nous à la compléter

  19. #19
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Le problème pourrait venir du where :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE f.datefacture BETWEEN '2008-01-01' AND '2008-01-31'
    Il serait plus sain de caster les valeurs en date.

  20. #20
    Membre à l'essai
    Inscrit en
    Mai 2007
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 45
    Points : 16
    Points
    16
    Par défaut
    je vais essayé ta requête tout de suite, par contre puis-je la faire comme sa, car refnumsoc je l'obtiens à partir d'une autre requête.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT MAX(f.numfacture) AS maxi
      FROM facture f
           INNER JOIN clients c ON f.numclient = c.numclient
     WHERE f.datefacture BETWEEN '2008-01-01' AND '2008-01-31'
     GROUP BY '$refnumsoc'
    Tu à tout a fait compris, je veux le N° MAX de facture de chaque société, enfin de la société auquel appartient le client sélectionné.

Discussions similaires

  1. [EJB3][HIBERNATE] Probleme avec select max
    Par kristof_machin dans le forum Hibernate
    Réponses: 2
    Dernier message: 26/04/2006, 13h05
  2. [MySQL] [BDD] Problème avec SELECT "dynamique"
    Par Vecine dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/03/2006, 11h11
  3. Problème avec select sous MYSQL
    Par Thomad dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/01/2006, 11h26
  4. problème avec select sur onchange
    Par Kerod dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 01/12/2005, 14h05
  5. Problème avec select top
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 10/12/2004, 14h55

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