Correction de requête

Eléphant du PHP | 226 Messages

17 juin 2010, 15:11

Bonjour,

J'ai la table suivante:
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:
(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
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,
«Le matin, quand il t’en coûte de te réveiller, que cette pensée te soit présente: c’est pour faire œuvre d’homme que je m’éveille.»
Marc Aurèle.

Mammouth du PHP | 672 Messages

17 juin 2010, 16:41

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,
:non:
Avec ce numéro de commande, tu voudrais qu'il napparaisse pas dans la liste.
Mais il est tout à fait normal, vu la requête, qu'il y soit :
(1057, 20100484, 'Sirop de Rose MONIN 70 cl', '2.0', 'Adultes', 14, '13.00'),
Le coût est différent de 0, donc il est pris dans le SELECT...

A quoi correspond le idCompt ? Il n'y aurait pas une autre table ?
C'est difficile à dire sans avoir la vision d'ensemble, mais là, j'ai un peu l'impression qu'il y a un problème de conception...

Eléphant du PHP | 226 Messages

17 juin 2010, 17:17

Le coût est différent de 0, donc il est pris dans le SELECT...
Je suis bien d'accord! Sauf que dans ce numéro de bon de commande, j'ai également des valeurs qui sont égales à 0:
(1063,  20100484, 'Sirop de canne à sucre', '1.0', 'Autre(s)', 14, '0.00'),
Or, ce que je voudrais obtenir, c'est uniquement les bons de commande dont toutes les valeurs de la colonne cout sont autres que 0. Le numéro de bon de commande ci-dessous, qui est complet, apparaît bien dans la liste et par rapport au résultat désiré (pas de 0 dans la colonne cout). Mais le numéro '20100484' est faux et n'a rien à faire dans cette liste, puisqu'il comporte toujours des valeurs à 0 dans la colonne cout.
INSERT INTO `compta` (`idCompt`, `nBonCom`, `designation`, `quantite`, `section`, `idUser`, `cout`) VALUES
(1096, 20100489, 'Carré de porc 8 côtes', '4.0', 'CAP', 4, '67.82'),
(1097, 20100489, 'PO parée', '4.0', 'CAP', 4, '79.38'),
(1098, 20100489, 'Poulet fermier PAC', '7.0', 'CAP', 4, '68.56'),
(1099, 20100489, 'Epaule de Porc', '2.0', 'CAP', 4, '38.17'),
(1100, 20100489, 'Filet de porc avec os', '7.0', 'CAP', 4, '247.61'),
(1101, 20100489, 'Magret de canard (Pièce de 300/350 Gr) (Par 4)', '4.0', 'Adultes', 5, '19.71'),
(1102, 20100489, 'Epaule d''agneau', '3.0', 'Adultes', 5, '47.95');
La requête est mal écrite, puisque je n'obtiens pas le résultat escompté. Mon souci étant que je ne vois pas du tout quoi faire pour la corriger...
merci,
«Le matin, quand il t’en coûte de te réveiller, que cette pensée te soit présente: c’est pour faire œuvre d’homme que je m’éveille.»
Marc Aurèle.

Mammouth du PHP | 672 Messages

18 juin 2010, 08:46

A quoi correspond le idCompt ? Il n'y aurait pas une autre table ?
C'est difficile à dire sans avoir la vision d'ensemble, mais là, j'ai un peu l'impression qu'il y a un problème de conception...

Eléphant du PHP | 226 Messages

18 juin 2010, 09:10

Oui, il y a d'autres tables et idCompt correspond à une clef primaire...
«Le matin, quand il t’en coûte de te réveiller, que cette pensée te soit présente: c’est pour faire œuvre d’homme que je m’éveille.»
Marc Aurèle.

Eléphant du PHP | 226 Messages

18 juin 2010, 11:24

Ok, j'ai eu une réponse sur un autre forum qui est fonctionnelle. Si ça peut aider/ intéresser d'autres personnes:
Une méthode parmis d'autres, c'est imposer la contrainte sur le groupe.
SELECT nBonCom
FROM compta
GROUP BY nBonCom
HAVING max(CASE cout WHEN 0 THEN 1 ELSE 0 END) = 0
Mais il est clair que je n'aurais pas pu la sortir tout seul cette requête...
«Le matin, quand il t’en coûte de te réveiller, que cette pensée te soit présente: c’est pour faire œuvre d’homme que je m’éveille.»
Marc Aurèle.