Page 1 sur 1

Correction de requête

Posté : 17 juin 2010, 15:11
par albius
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,

Re: Correction de requête

Posté : 17 juin 2010, 16:41
par macgawel
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...

Re: Correction de requête

Posté : 17 juin 2010, 17:17
par albius
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,

Re: Correction de requête

Posté : 18 juin 2010, 08:46
par macgawel
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...

Re: Correction de requête

Posté : 18 juin 2010, 09:10
par albius
Oui, il y a d'autres tables et idCompt correspond à une clef primaire...

Re: Correction de requête

Posté : 18 juin 2010, 11:24
par albius
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...