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

Requêtes MySQL Discussion :

Correction de requête


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    295
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 295
    Points : 92
    Points
    92
    Par défaut Correction de requête
    Bonjour,

    J'ai la table suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE IF NOT EXISTS `compta` (
      `idCompt` int(4) NOT NULL AUTO_INCREMENT,
      `nBonCom` int(10) NOT NULL,
      `designation` text COLLATE utf8_unicode_ci NOT NULL,
      `quantite` decimal(10,1) NOT NULL,
      `section` text COLLATE utf8_unicode_ci NOT NULL,
      `idUser` int(2) NOT NULL,
      `cout` decimal(10,2) NOT NULL,
      PRIMARY KEY (`idCompt`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1605 ;
    Avec quelques données suivantes par exemples:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    (1062, 20100484, 'Sirop de Fraise MONIN 70 cl', '1.0', 'Autre(s)', 14, '7.21'),
    (1061, 20100484, 'Coca-cola (Caisse de 12*20cl)', '20.0', 'Autre(s)', 14, '44.14'),
    ...
    (1058, 20100484, 'Liqueur de Griottes', '1.0', 'Adultes', 14, '0.00'),
    (1057, 20100484, 'Sirop de Rose MONIN 70 cl', '2.0', 'Adultes', 14, '13.00'),
    (1063, 20100484, 'Sirop de canne à sucre', '1.0', 'Autre(s)', 14, '0.00'),
    ...
    L'idée étant avec la requête suivante de n'afficher que les numéros de bon de commandes (champ nBonCom) dont toutes les valeurs du champ cout serait strictement différente de 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT `nBonCom`
        FROM compta
        WHERE cout !=0
        ORDER BY `nBonCom`
    Malgré tout, avec cette requête, j'obtiens des numéros de bon qui peuvent toujours contenir des valeurs à 0 dans la colonne cout. Avec le numéro de bon de commande ci-dessus (20100484), il ne devrait pas apparaître dans la liste. Comment puis-je corriger cette requête ?
    merci,

  2. #2
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Bonjour,

    Est-ce que ceci fonctionne ? :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT DISTINCT `nBonCom`
        FROM compta
        WHERE cout != '0.00'
        ORDER BY `nBonCom`

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    295
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 295
    Points : 92
    Points
    92
    Par défaut re:
    Non, j'obtiens toujours le même résultat. Merci,

  4. #4
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    Tu dis "dont toutes les valeurs sont différentes de 0"... et ta requête fait "les valeurs différentes de 0".

    Une méthode parmis d'autres, c'est imposer la contrainte sur le groupe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT nBonCom
    FROM compta
    GROUP BY nBonCom
    HAVING max(CASE cout WHEN 0 THEN 1 ELSE 0 END) = 0

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    295
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 295
    Points : 92
    Points
    92
    Par défaut re:
    Ok! Ce sont bien les résultats attendus qui s'affichent. Mais il est très clair, pour ne pas dire limpide, que je n'aurais pas pu la sortir tout seul cette requête. Et pour être sincère, il y a des termes que je n'ai encore jamais vu jusqu'à présent! Pourrais-tu s'il te plaît me l'expliquer un peu plus en plus en détail ? Et de mon côté, je crois que je vais faire un tour du côté de la documentation...
    Dans tous les cas, merci beaucoup.

  6. #6
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Je pense que tu connais les clauses suivantes :

    SELECT
    FROM
    WHERE
    ORDER BY

    Les deux nouvelles servent aux agrégats :
    GROUP BY col1, col2, ... : sert à définir des regroupements. En résultats, il n'y aura qu'une ligne par valeurs distinctes de (col1, col2, ...). Ainsi, dans ton SELECT, tu pourras définir des grandeurs portant sur le groupe et non sur chaque ligne :

    SELECT col1, col2, count(*) as nb, sum(col3) as montanttotal : pour chaque couple col1, col2, le nombre de lignes et la somme des montants
    Du moins dans la norme SQL. Il me semble que MySQL permette faire un peu plus de trucs... mais cela ne me regarde pas

    Maintenant, si comme dans ta requête tu veux définir une restriction sur la sélection des groupes, tu ne peux utiliser le WHERE :
    Ce que tu mets dans le WHERE sera évalué avant de constituer tes groupes.

    C'est à cela que sert la clause HAVING :

    HAVING count(*) = 2 : garde les groupes constitués à partir de deux lignes
    HAVING sum(mnt) > 100 : dont le montant cumulé est supérieur à 100

    ...

    Enfin, il reste le CASE WHEN : l'idée est simplement de flagger dans le groupe les cout = 0

    Cela dit, ce n'est effectivement pas la méthode la plus intuitive, mais potentiellement la plus performante.

    Tu pouvais également faire ça avec du NOT EXISTS (afin de ne pas sélectionner les commandes pour lesquelles il existe une ligne cout = 0)

    Ca va mieux ?

    (Effectivement, un tour dans les tutos peut être très bénéfique, tu verras qu'on peut faire pleins de trucs en SQL )

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    295
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 295
    Points : 92
    Points
    92
    Par défaut
    Bonjour,

    Oui, c'est bien plus clair maintenant. Merci pour les explications...

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

Discussions similaires

  1. Correction de requête
    Par yann18 dans le forum Requêtes
    Réponses: 5
    Dernier message: 06/12/2011, 15h45
  2. comment trier correctement mes requêtes ?
    Par isodoro dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 21/03/2009, 16h12
  3. Comment rendre correcte cette requête ?
    Par Seb981 dans le forum Langage SQL
    Réponses: 19
    Dernier message: 27/06/2007, 07h34
  4. Réponses: 2
    Dernier message: 23/07/2006, 15h07
  5. Correction de requête SVP
    Par Le Pharaon dans le forum Langage SQL
    Réponses: 3
    Dernier message: 20/01/2006, 13h32

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