Requête min et max sur tranche horaire

PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021 - 20 août 2013 à 10:59
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021 - 22 août 2013 à 12:21
Bonjour,
J'ai une table X contenant:
une colonne Articles (contenant déjà les articles A, B, A, B, B, A, C,...) et
une colonne date_et_heure_de_vente de chaque article sous le format VARCHAR(18) (exemple: 201307300700570225; ici 07 est l'heure)

J'ai une autre table Y contenant:
une colonne Article (et les articles déjà nommés A, B, C,...)
une colonne MIN
une colonne MAX
J'aimerais en une requête mettre à jour la colonne MIN à partir des ventes de la tranche horaire minimum (je n'ai pas forcément besoin de connaître quelle tranche horaire)
et (éventuellement avec une autre requête) dans une colonne MAX, les ventes de la tranche horaire maximum.
(La table Y contient déjà les colonnes nommées MIN et MAX ainsi que l'intitulé des articles)
MIN et MAX basés sur un COUNT du nombre d'articles (pas le montant des ventes)

Je renonce, je suis perdu, trop de tentatives et pas assez d'expérience :-/
Merci pour vos conseils avisés ;-)
PhilLu

13 réponses

PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
20 août 2013 à 16:45
La tranche horaire minimum est en fait la tranche horaire (p.ex. de 11 à 12h) dans laquelle le nombre de vente de l'article ('A' par exemple) est vendu en moins grand nombre par rapport aux autres tranches horaires.
idem pour maximum = la tranche horaire dans laquelle l'article est le plus vendu par rapport aux autres tranches horaires.

Table A:(source)
Article DateHeure
A 20130730094342
A 20130730095345
B 20130730100342
C 20130730103215
C 20130730104545
C 20130730105214
E 20130730112636
A 20130730151247
B 20130730154825
B 20130730155912
C 20130730160645

Table B:(destination)
Article: Min Max
A 15 09
B 10 15
C 16 10
D
E 11 11

Merci pour votre aide!!! HELP :-/
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
21 août 2013 à 10:56
Salut,

Quelle est la règle de gestion en cas d'égalité de représentation d'un minimum ou d'un maximum ?
(si par exemple ton article A a une tranche horaire minimum sur 15h et 10h ?)
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
21 août 2013 à 11:14
Merci Simon!
En fait je n'ai pas besoin de connaître la tranche horaire, mais la quantité MIN par exemple.
Je me rends maintenant compte que je me suis planté dans l'exemple de la table B !!!!!!!!!!!!!
En fait, si j'ai la même quantité dans 2 tranches horaires et que celle-ci est la plus basse par rapport aux autres tranches horaires, il faut retourner la quantité seulement.
(exemple: si j'ai des ventes pour l'article A de 5 à 123 et que deux tranches horaires sont à 5, il faut placer 5 dans MIN de la table B pour l'article A.)
J'espère que c'est plus clair; désolé pour mon erreur d'explication :-/
Sympa de m'aider!!!
PhilLu
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
21 août 2013 à 11:50
Comprends pas bien...
Tu veux pour chaque article le minimum et le maximum vendu par tranche horaire, mais tu t'en fous de la tranche, c'est ça ?
Ta table B serait alors :
Article | Min | Max
A | 1 | 2
B | 1 | 2
C | 1 | 3
etc...

C'est ça ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
21 août 2013 à 11:52
Oui, tout à fait!
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
21 août 2013 à 12:18
ok j'essaie de regarder ça rapido
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
21 août 2013 à 12:19
Cool ! ! !
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
21 août 2013 à 15:14
T'es sur quel SGBD au fait ?
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
21 août 2013 à 15:40
Alors, je te propose ceci (avec A = TBL_VENTES et B = TBL_ANALYSE) (testé sous Firebird)
UPDATE TBL_ANALYSE T2
Set T2.MINI = 
(Select MIN(T1.NBOCC) 
From
	/* Recherche des représentations de chaque tranche horaire pour l'article mis à jour sur T2*/
	(Select ARTICLE, Substring(DATEHEURE from 9 for 2) as TRANCHE, Count(Substring(DATEHEURE from 9 for 2)) as NBOCC
	From TBL_VENTES
	Where ARTICLE = T2.ARTICLE
	Group by ARTICLE, TRANCHE) T1
Group by T1.ARTICLE),
T2.MAXI = 
(Select MAX(T2.NBOCC) 
From 
	(Select ARTICLE, Substring(DATEHEURE from 9 for 2) as TRANCHE, Count(Substring(DATEHEURE from 9 for 2)) as NBOCC
	From TBL_VENTES
	Where ARTICLE = T2.ARTICLE
	Group by ARTICLE, TRANCHE) T2
Group by T2.ARTICLE);


Petites remarques :
- Pour ce traitement, ça t'oblige à avoir toute la liste d'article déjà saisis dans ta table B. Si tu oublies d'ajouter un nouvel article par exemple, cette requête d'update ne le fera pas apparaitre. J'ai essayé avec un "update or insert", mais il semble que Firebird n'accepte pas de sous-requête dans ce cas là, uniquement un "Values". Je me demande s'il ne vaudrait mieux pas vider ta table et faire une requête d'insert... Enfin, c'est toi qui voit.
- Pourquoi avoir utilisé un champ varchar au lieu d'un timestamp pour ton dateheure ?
0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
21 août 2013 à 16:48
Super,
Je teste maintenant.

J'ai déjà le nom des champs dans la première colonne de la table B.

J'avais utilisé VARCHAR(18) parce que le système m'envoie les millisecondes, mais je peux changer cela en 2 secondes sans incidence sur le reste; si cela simplifie le code :-)

J'utilise MySQL.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
21 août 2013 à 16:58
"J'avais utilisé VARCHAR(18) parce que le système m'envoie les millisecondes, mais je peux changer cela en 2 secondes sans incidence sur le reste; si cela simplifie le code :-) "
-> boaf, simplifier le traitement, je ne suis pas sûr... plus logique, oui... Enfin, c'est un choix...

"J'utilise MySQL."
-> Dans ce cas, il va peut être te falloir adapter un peu la syntaxe de la requête (notamment sur le substring) mais l'idée est là.
0
sp40 Messages postés 1276 Date d'inscription mardi 28 octobre 2003 Statut Contributeur Dernière intervention 3 juillet 2015 15
22 août 2013 à 11:33
Sorry, j'ai vu une petite confusion possible dans mon code (alias "T2" donné à deux tables). Ça n'a pas l'air d'avoir d'influence, mais quand même... Comme ça c'est plus propre.

UPDATE TBL_ANALYSE T0
Set T0.MINI = 
(Select MIN(T1.NBOCC) 
From
	/* Recherche des représentations de chaque tranche horaire pour l'article mis à jour sur T0*/
	(Select ARTICLE, Substring(DATEHEURE from 9 for 2) as TRANCHE, Count(Substring(DATEHEURE from 9 for 2)) as NBOCC
	From TBL_VENTES
	Where ARTICLE = T0.ARTICLE
	Group by ARTICLE, TRANCHE) T1
Group by T1.ARTICLE),
T0.MAXI = 
(Select MAX(T2.NBOCC) 
From 
	(Select ARTICLE, Substring(DATEHEURE from 9 for 2) as TRANCHE, Count(Substring(DATEHEURE from 9 for 2)) as NBOCC
	From TBL_VENTES
	Where ARTICLE = T0.ARTICLE
	Group by ARTICLE, TRANCHE) T2
Group by T2.ARTICLE);

0
PhilLu Messages postés 251 Date d'inscription lundi 9 novembre 2009 Statut Membre Dernière intervention 11 mai 2021
22 août 2013 à 12:21
J'avais vu et testé qq variantes mais comme je ramais sur ce problème, j'ai résolu cela autrement, comme ceci:

Récupération du nombre de record dans la table de sortie à l'aide d'un: SELECT COUNT(*) FROM table_sortie

Boucle externe (i=0->nbr record-1) de sélection du nom de l'article à l'aide de: SELECT article FROM ventes LIMIT i,1

Boucle interne de calcul des MIN et MAX par tranche d'heure WHERE nom de l'article
UPDATE MIN et MAX dans table_sortie

Fin boucle interne

Fin boucle externe

En tout cas Simon, merci pour ton aide!!!
0
Rejoignez-nous