trouver des enregistrements en fction d'un seuil

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : trouver des enregistrements en fction d'un seuil

par FAbrice » 13 oct. 2005, 07:57

Bonnjour,

CA MARCHE !!!! \:D/

Franchement, je vous :love4: (en tout bien, tout honneur bien sur :wink: )

Je vous remercie de votra aide et surtout de votre patience!!!

FAb

PS:si vous etes chaud, j'ai un autre souci qui se trouve a cette adresse:
http://www.phpfrance.com/forums/voir_sujet-9265-15.php :agenouille:
:mrgreen:

par sadeq » 12 oct. 2005, 17:51

suggestion correcte.
Le HAVING est un filtre qui ne s'applique qu'après regroupement. si il y a calcul, les champs calculés sont créés avant le HAVING et généralement après le regroupement GROUP BY.

Dans notre cas, le champ "test" qui désigne la somme (SUM) est créé après le regroupement et avant l'application du filtre HAVING, ce dernier peut alors le voir.

Contrairement à un WHERE, qui lui ne peut voir les champs calculés car il ne sont créés qu'après son application (généralement lors d'un GROUP BY explicite ou implicite)

Je rappelle que l'ordre d'exécution d'un SELECT est :
1. lecture des sources (FROM)
2. application du WHERE pour filtrage du jeu de réponse (tuple)
3. calcul avec/sans GROUP BY : création des champs calculés
4. filtrage par groupe (HAVING pour GROUP BY explicite ou implicite)
5. tri (ORDER BY) pour réorganiser le tuple
6. écriture du tuple selon la structure des champs du SELECT

On comprend alors pourquoi il est incorrect d'inclure un champ de calcul dans la clause WHERE puisque ce champ n'existe pas lors de l'application du WHERE.
Et on voit aussi pourquoi les champs de calcul sont tolérés dans les clauses HAVING et ORDER BY puisqu'ils sont créés avant

par Cyrano » 12 oct. 2005, 16:03

...tu va voir, c simple comme tout!! ...
lol, ben oui, on en est QU'À 5 pages sur le sujet :langue:
c'est simple comme tout, ajoute un HAVING au GROUP by de ta requête :
SELECT  r.NumDossier, 
 r.NumOT, 
 r.NumPompe, 
 r.Marques, 
 r.Models, 
 r.Secteur, 
 r.Urgence, 
 r.Datedebut, 
 r.Cloture, 
 SUM( p.Points ) AS test 
FROM registre AS r, points AS p 
WHERE r.ID = p.Numdossier 
AND TO_DAYS(r.Datedebut) > TO_DAYS('2005-02-01') 
GROUP BY r.NumDossier
HAVING SUM( p.Points ) < $valeur_saisie
Suggestion: comme le champ pour le suil est déjà aliasé, on peut peut-être utiliser l'alias?

Code : Tout sélectionner

SELECT r.NumDossier, r.NumOT, r.NumPompe, r.Marques, r.Models, r.Secteur, r.Urgence, r.Datedebut, r.Cloture, SUM( p.Points ) AS test FROM registre AS r, points AS p WHERE r.ID = p.Numdossier AND TO_DAYS(r.Datedebut) > TO_DAYS('2005-02-01') GROUP BY r.NumDossier HAVING test < $valeur_saisie
:?:

par sadeq » 12 oct. 2005, 12:44

c'est simple comme tout, ajoute un HAVING au GROUP by de ta requête :
SELECT  r.NumDossier, 
 r.NumOT, 
 r.NumPompe, 
 r.Marques, 
 r.Models, 
 r.Secteur, 
 r.Urgence, 
 r.Datedebut, 
 r.Cloture, 
 SUM( p.Points ) AS test 
FROM registre AS r, points AS p 
WHERE r.ID = p.Numdossier 
AND TO_DAYS(r.Datedebut) > TO_DAYS('2005-02-01') 
GROUP BY r.NumDossier
HAVING SUM( p.Points ) < $valeur_saisie

par FAbrice » 12 oct. 2005, 10:53

lol,

tu va voir, c simple comme tout!!

Je cherche a afficher tous les enregistrements compris entre 2 dates (ca, c fait) et dont la somme des points ( SUM( p.Points ) AS test ) est inferieure a une valeure qui est saisie dans une zone texte.

voila, tu vois, c tout simple :wink:

par Cyrano » 12 oct. 2005, 10:28

Alors reprenons parce que depius le début, il y a eu une certaine évolution et j'en ai perdu des bouts en route: quel seuil veux-tu utiliser dans ta requête ?

par FAbrice » 12 oct. 2005, 09:04

enfait, j'avais mal lu :oops: , dsl, ca marche bien en fait!

Comme je disais, reste plus que le probleme du seuil!
tu penses avoir une solution?

par Cyrano » 12 oct. 2005, 08:55

si je mets "FROM registre AS r, points AS p", il y a un message d'erreur
Ça ne me parle pas beaucoup : si tu ne précises pas quel message d'erreur, je ne devinerai sûrement pas :?

par FAbrice » 12 oct. 2005, 07:32

bpnjour,

jusque la ca va, a la seule différence que si je mets "FROM registre AS r, points AS p", il y a un message d'erreur mais si je mets fraom registre, points, tout va bien!

maintenant, reste plus que l'histoire du seuil, et c gagné :wink:

par Cyrano » 11 oct. 2005, 11:58

Bon, voilà la requête corrigée, comme tu vois, ça a pas été très long:

Code : Tout sélectionner

SELECT r.NumDossier, r.NumOT, r.NumPompe, r.Marques, r.Models, r.Secteur, r.Urgence, r.Datedebut, r.Cloture, SUM( p.Points ) AS test FROM registre AS r, points AS p WHERE r.ID = p.Numdossier AND TO_DAYS(r.Datedebut) > TO_DAYS('2005-02-01') GROUP BY r.NumDossier
Voici le résultat obtenu:

Code : Tout sélectionner

+----------+------------------+-----------+---------+--------+---------+---------+--------------------+---------+-----+ |NumDossier| NumOT | NumPompe | Marques | Models | Secteur | Urgence | Datedebut | Cloture | test| +----------+------------------+-----------+---------+--------+---------+---------+--------------------+---------+-----+ |9558/0 | 15030131756-0010| PE 2590 | 6 | 8 | 42 | 2 | 2005-02-18 15:00:00| oui | 2070| |9601/0 | 15030136659-0010| PDCE 0631 | 9 | 18 | 51 | 2 | 2005-02-22 09:20:00| oui | 1334| +----------+------------------+-----------+---------+--------+---------+---------+--------------------+---------+-----+
Est-ce que c'est ce que tu attendais ?

Pourquoi ça marche alors qu'en apparence la requête est la même que la tienne ? Ce sont de petits détails parfois insignifiants qui font la différence: tu avais essayé avec TO_DAYS(2005 -02 -01) : regarde comment j'ai modifié: T_DAYS('2005-02-01') : pas d'espace dans la chaîne de la date et le tout entre apostrophes.

Ça va jusque là ?

par sadeq » 11 oct. 2005, 11:48

On voit bien que ses valeurs de dates ont le même format que celles comparées, y'a pas besoin de test alors.
Mais l'erreur est que la valeur d'une date doit être traitée comme une chaine. Il faut écrire la valeur entre quotes ou guillemets.
SELECT registre.NumDossier, registre.NumOT, registre.NumPompe, registre.Marques, registre.Models, registre.Secteur, registre.Urgence, registre.Datedebut, registre.Cloture, SUM( points.Points ) AS test
FROM registre, points
WHERE registre.ID = points.Numdossier
AND registre.Datedebut > '2005-02-01'
AND registre.Datedebut < '2005-02-28'
GROUP BY registre.NumDossier
ORDER BY test DESC 
ou bien utiliser Between puisque c'est une plage.
SELECT registre.NumDossier, registre.NumOT, registre.NumPompe, registre.Marques, registre.Models, registre.Secteur, registre.Urgence, registre.Datedebut, registre.Cloture, SUM( points.Points ) AS test
FROM registre, points
WHERE registre.ID = points.Numdossier
AND registre.Datedebut
BETWEEN '2005-02-01'
AND '2005-02-28'
GROUP BY registre.NumDossier
ORDER BY test DESC 
T'as au moins deux dossiers qui doivent répondre à cette requête : le 9558/0 Datedebut : 2005-02-18 et le 9601/0 Datedebut : 2005-02-22

par Cyrano » 11 oct. 2005, 11:39

Ok, je vais faire des tests et je reviens avec le résultat dès que je le trouve.

par FAbrice » 11 oct. 2005, 11:33

Code : Tout sélectionner

# # Structure de la table `points` # CREATE TABLE `points` ( `ID` mediumint(4) NOT NULL auto_increment, `Numdossier` text NOT NULL, `Operations` text NOT NULL, `Zones` text NOT NULL, `Points` text NOT NULL, `Heure` datetime NOT NULL default '0000-00-00 00:00:00', PRIMARY KEY (`ID`) ) TYPE=MyISAM AUTO_INCREMENT=661 ; # # Contenu de la table `points` # INSERT INTO `points` VALUES (22, '49', '8', '1', '414', '2005-02-23 00:00:00'); INSERT INTO `points` VALUES (21, '49', '7', '1', '276', '2005-02-23 00:00:00'); INSERT INTO `points` VALUES (13, '27', '3', '3', '1', '2005-02-15 00:00:00'); INSERT INTO `points` VALUES (12, '27', '1', '3', '100', '2005-02-15 00:00:00'); INSERT INTO `points` VALUES (20, '49', '5', '1', '90', '2005-02-23 00:00:00'); INSERT INTO `points` VALUES (10, '27', '2', '2', '34', '2005-02-14 00:00:00'); INSERT INTO `points` VALUES (9, '27', '3', '1', '100', '2005-02-13 00:00:00'); INSERT INTO `points` VALUES (8, '27', '1', '1', '2345', '2005-02-12 00:00:00'); INSERT INTO `points` VALUES (19, '49', '2', '1', '1290', '2005-02-23 00:00:00'); INSERT INTO `points` VALUES (23, '45', '2', '1', '765', '2005-02-24 00:00:00'); INSERT INTO `points` VALUES (24, '45', '3', '1', '228', '2005-02-24 00:00:00'); INSERT INTO `points` VALUES (25, '45', '9', '1', '192', '2005-02-24 00:00:00'); INSERT INTO `points` VALUES (26, '45', '10', '1', '149', '2005-02-24 00:00:00'); # # Structure de la table `registre` # CREATE TABLE `registre` ( `ID` mediumint(4) NOT NULL auto_increment, `NumDossier` varchar(15) NOT NULL default '', `NumOT` varchar(16) NOT NULL default '', `NumPompe` varchar(9) NOT NULL default '', `Marques` text NOT NULL, `Models` text NOT NULL, `Secteur` text NOT NULL, `Urgence` varchar(5) NOT NULL default '0', `Datedebut` datetime NOT NULL default '0000-00-00 00:00:00', `Datefin` datetime default '0000-00-00 00:00:00', `Heure` varchar(50) NOT NULL default '', `Cloture` varchar(4) default 'non', `Totalpoint` text, `Avisot` text NOT NULL, `Typefacture` text NOT NULL, PRIMARY KEY (`ID`) ) TYPE=MyISAM AUTO_INCREMENT=286 ; # # Contenu de la table `registre` # INSERT INTO `registre` VALUES (51, '9608/0', '15030137126-0010', 'PE 2466', '12', '22', '43', '3', '2005-02-25 14:00:00', '0000-00-00 00:00:00', '2005-02-25 13:58:03', 'oui', NULL, '', '2'); INSERT INTO `registre` VALUES (21, '- num dossier -', '', '', '', '', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', 'non', '', '', ''); INSERT INTO `registre` VALUES (52, '9610/0', '15030138301-0010', 'PDCE 0182', '8', '25', '44', '2', '2005-02-28 16:00:00', '0000-00-00 00:00:00', '2005-02-28 15:50:34', 'oui', NULL, '', '2'); INSERT INTO `registre` VALUES (48, '9603/0', '15030136671-0010', 'PMP 1483', '10', '20', '51', '2', '2005-02-23 11:05:00', '0000-00-00 00:00:00', '2005-02-23 11:01:13', 'oui', NULL, '', '1'); INSERT INTO `registre` VALUES (49, '9558/0', '15030131756-0010', 'PE 2590', '6', '8', '42', '2', '2005-02-18 15:00:00', '0000-00-00 00:00:00', '2005-02-23 14:49:28', 'oui', NULL, '', '2'); INSERT INTO `registre` VALUES (50, '9607/0', '15030136672-0010', 'PMP 1455', '11', '21', '51', '1', '2005-02-24 11:45:00', '0000-00-00 00:00:00', '2005-02-24 11:43:16', 'oui', NULL, '', '2'); INSERT INTO `registre` VALUES (45, '9601/0', '15030136659-0010', 'PDCE 0631', '9', '18', '51', '2', '2005-02-22 09:20:00', '0000-00-00 00:00:00', '2005-02-23 09:16:58', 'oui', NULL, '', '1'); INSERT INTO `registre` VALUES (53, '9611/0', '15030138302-0010', 'PD 0409', '13', '24', '54', '2', '2005-02-28 16:00:00', '0000-00-00 00:00:00', '2005-02-28 15:52:40', 'oui', NULL, '', '2'); INSERT INTO `registre` VALUES (54, '9612/0', '15030138308-0010', 'PA 1567', '9', '26', '45', '2', '2005-03-01 14:45:00', '0000-00-00 00:00:00', '2005-03-01 14:39:58', 'oui', NULL, '', '1'); INSERT INTO `registre` VALUES (55, '9613/0', '15030138309-0010', 'PA 1344', '2', '13', '45', '2', '2005-03-01 14:45:00', '0000-00-00 00:00:00', '2005-03-01 14:41:25', 'oui', NULL, '', '1'); INSERT INTO `registre` VALUES (56, '9622/0', '15030138877-0010', 'PMP 1468', '9', '27', '51', '2', '2005-03-07 16:00:00', '0000-00-00 00:00:00', '2005-03-07 15:46:06', 'oui', NULL, '', '1'); INSERT INTO `registre` VALUES (57, '9623/0', '15030139515-0010', 'PDCE 615', '14', '28', '43', '2', '2005-03-08 09:30:00', '0000-00-00 00:00:00', '2005-03-08 09:33:42', 'oui', NULL, '', '2'); INSERT INTO `registre` VALUES (58, '9631/0', '15030140721-0010', 'PE 2533', '6', '29', '44', '1', '2005-03-15 12:00:00', '0000-00-00 00:00:00', '2005-03-16 07:45:15', 'oui', NULL, '', '2'); INSERT INTO `registre` VALUES (59, '9635/0', '15030142397-0010', 'PE 1777', '10', '30', '42', '3', '2005-03-17 10:30:00', '0000-00-00 00:00:00', '2005-03-17 10:29:11', 'oui', NULL, '', '1');

dsl, :oops: , je ne me souvenais plus qu'en exportant on avait les données aussi!!!

PS: je trouvais ca clair moi :wink:

par Cyrano » 11 oct. 2005, 11:17

:shock: Non mais je rêve complètement là.....
regarde dans phpMyAdmin, il y a un bouton marqué [Exporter] : je veux bien t'aider, mais faudrait un minimum quand même, je vais pas me farcir de recréer la base à la main, génère un fichier sql et colle ça entre deux balises [code][/code]

par FAbrice » 11 oct. 2005, 10:58

Points
Champ Type Attributs Null Défaut Extra Action
ID mediumint(4) Non auto_increment
Numdossier text Non
Operations text Non
Zones text Non
Points text Non
Heure datetime Non 0000-00-00 00:00:00



ID Numdossier Operations Zones Points Heure
22 49 8 1 414 2005-02-23 00:00:00
21 49 7 1 276 2005-02-23 00:00:00
13 27 3 3 1 2005-02-15 00:00:00
12 27 1 3 100 2005-02-15 00:00:00
20 49 5 1 90 2005-02-23 00:00:00
10 27 2 2 34 2005-02-14 00:00:00
9 27 3 1 100 2005-02-13 00:00:00
8 27 1 1 2345 2005-02-12 00:00:00
19 49 2 1 1290 2005-02-23 00:00:00
23 45 2 1 765 2005-02-24 00:00:00
24 45 3 1 228 2005-02-24 00:00:00

registre

Champ Type Attributs Null Défaut Extra Action
ID mediumint(4) Non auto_increment
NumDossier varchar(15) Non
NumOT varchar(16) Non
NumPompe varchar(9) Non
Marques text Non
Models text Non
Secteur text Non
Urgence varchar(5) Non 0
Datedebut datetime Non 0000-00-00 00:00:00
Datefin datetime Oui 0000-00-00 00:00:00
Heure varchar(50) Non
Cloture varchar(4) Oui non
Totalpoint text Oui NULL
Avisot text Non
Typefacture text Non



ID NumDossier NumOT NumPompe Marques Models Secteur Urgence Datedebut Datefin Heure Cloture Totalpoint Avisot Typefacture
51 9608/0 15030137126-0010 PE 2466 12 22 43 3 2005-02-25 14:00:00 0000-00-00 00:00:00 2005-02-25 13:58:03 oui NULL 2
21 - num dossier - 0000-00-00 00:00:00 0000-00-00 00:00:00 non
52 9610/0 15030138301-0010 PDCE 0182 8 25 44 2 2005-02-28 16:00:00 0000-00-00 00:00:00 2005-02-28 15:50:34 oui NULL 2
48 9603/0 15030136671-0010 PMP 1483 10 20 51 2 2005-02-23 11:05:00 0000-00-00 00:00:00 2005-02-23 11:01:13 oui NULL 1
49 9558/0 15030131756-0010 PE 2590 6 8 42 2 2005-02-18 15:00:00 0000-00-00 00:00:00 2005-02-23 14:49:28 oui NULL 2
50 9607/0 15030136672-0010 PMP 1455 11 21 51 1 2005-02-24 11:45:00 0000-00-00 00:00:00 2005-02-24 11:43:16 oui NULL 2
45 9601/0 15030136659-0010 PDCE 0631 9 18 51 2 2005-02-22 09:20:00 0000-00-00 00:00:00 2005-02-23 09:16:58 oui NULL 1


Voici la base point et registre. j'ai mis en prmier les carateristisques des champs et ensuites quelques valeures (j'espère que ma mise en page va etre correcte !!!)

merci bcq,
FAb