grouper des champs suivant une condition

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 : grouper des champs suivant une condition

par ouckileou » 05 juin 2005, 14:30

Bon courage.
héhé merci :lol:

Bon pour revenir au sujet initial, j'ai réussi à faire ce que je voulais faire, à savoir un classement directement en SQL

je le poste des fois que ça intéresse quelqu'un, vous verrez si c'est bien ça que vous aviez compris ;)

donc voici une petite table pour tester :

Code : Tout sélectionner

# # Table structure for table 'operations' # CREATE TABLE operations ( id_operation int(3) unsigned NOT NULL auto_increment, date_debut date default NULL, date_fin date default NULL, ecart tinyint(3) unsigned default NULL, PRIMARY KEY (id_operation), KEY id (id_operation) ) ENGINE=MyISAM DEFAULT CHARSET=latin1; # # Dumping data for table 'operations' # INSERT INTO operations VALUES("1", "2005-06-05", "2005-06-10", "5"); INSERT INTO operations VALUES("2", "2005-06-05", "2005-06-15", "10"); INSERT INTO operations VALUES("3", "2005-06-05", "2005-06-11", "6"); INSERT INTO operations VALUES("4", "2005-06-05", "2005-06-28", "22"); INSERT INTO operations VALUES("5", "2005-06-05", "2005-06-25", "20"); INSERT INTO operations VALUES("6", "2005-06-05", "2005-07-10", "35"); INSERT INTO operations VALUES("7", "2005-06-05", "2005-06-06", "1");
j'ai mis ici un champ écart pour vérifier, mais normalement on est pas censé l'avoir, sinon ça sert à rien :)

et ensuite la requête
d'abord simplement créer un champ qui contient le libellé de la catégorie

Code : Tout sélectionner

# les critères de tri # ecart <= 7 -> 'DM' # ecart <= 15 -> 'SP' # ecart <= 30 -> 'SS' # ecart > 30 -> 'MS' SELECT id_operation, date_debut, date_fin, ecart, CASE WHEN DATEDIFF(date_fin,date_debut) <= 7 THEN "DM" WHEN DATEDIFF(date_fin,date_debut) <= 15 THEN "SP" WHEN DATEDIFF(date_fin,date_debut) <= 30 THEN "SP" ELSE "MS" END AS categorie FROM operations;
et là, le regroupement par catégorie

Code : Tout sélectionner

SELECT COUNT(*) AS nbre_operations, CASE WHEN DATEDIFF(date_fin,date_debut) <= 7 THEN "DM" WHEN DATEDIFF(date_fin,date_debut) <= 15 THEN "SP" WHEN DATEDIFF(date_fin,date_debut) <= 30 THEN "SP" ELSE "MS" END AS categorie FROM operations GROUP BY categorie;
et voilà, comme ça on a nos valeurs déjà classées, le résultat de la commande :
3 | DM
1 | MS
3 | SP
ah ça me fait rêver :cry:

par pjl » 04 juin 2005, 20:24

Y'a pas à dire. Il y a vraiment des brèles qui occupent certaines fonctions.

Qu'un dev amateur fasse celà, OK mais dans une appli pro.............

Bon courage.

par ouckileou » 04 juin 2005, 16:39

vous allez rire, mais apparament ils pour habitude de bosser directement sur la prod...

pour l'instant ce n'est pas gênant pour moi car je développe un truc nouveau qui n'est pas accessible pour le moment

mais ça c'est un autre problème dont je discuterai avec eux le moment venu

pour l'instant, le problème c'est que les dates sont stockées comme ça :
"aaaammjj"

donc en passant tout en date je ne sais pas si ça va bien garder les infos
et il faudrait modifier toutes les manipulations effectuées sur ces champs dans l'appli

et là je me vois mal leur imposer de faire ça en ma qualité de petit stagiaire
d'autant que comme je l'ai dit, eux ça leur convient très bien :roll:

je partage votre avis, mais parfois quand on débarque quelque part on a pas forcément les moyens de tout chambouler alors on s'adapte :(

par pjl » 04 juin 2005, 15:05

Celà fait partie des pré-requis mais tu as bien raison de le préciser.

J'ai un peu trop l'habitude et j'oublie de le préciser.

par mere-teresa » 04 juin 2005, 14:00

Déjà, si j'étais à ta place, je ferais une copie de l'application et de la base puis je passerai en force le champ au format date. Si toutes les dates sont réellement au format yyyy-mm-dd, ca devrait passer sans problème puis après je teste l'application pour voir si elle buge ou pas.
En fait, on espère que tu bosses déjà sur une copie de l'application.
Et que tu fais du versionning (tu enregistres tes différentes versions de programmes, au fur et à mesure, au lieu de toucher au même programme tout du long)

par pjl » 04 juin 2005, 12:37

On ne doit pas avoir le même age et donc ne pas réagir de la même facon.

Dans ce genre de cas de figure, surtout si c'est l'application principale de la boite, si mon chef me demande de faire un truc non conforme, je prépare un dossier et déclanche une réunion entre moi, mon chef et son supérieur ou/et les autres développeurs.
Déjà, c'est une précaution pour que l'on ne vienne pas me dire ensuite que l'on ne savait pas.

Maintenant, c'est vrai qu'en tant que stagiaire, c'est moins évident.

Déjà, si j'étais à ta place, je ferais une copie de l'application et de la base puis je passerai en force le champ au format date. Si toutes les dates sont réellement au format yyyy-mm-dd, ca devrait passer sans problème puis après je teste l'application pour voir si elle buge ou pas.

Maintenant, tu me dis te tenir compte de la réalité mais il n'y a jamais qu'une seule réalité. Tout dépend du coté ou on se place.
Essaye discrètement de savoir qui a concu la base de données. Tu pourrais avoir une surprise.

par ouckileou » 04 juin 2005, 12:13

Une date se stocke dans un champ au format date.
Point barre.
ça je suis bien d'accord...
Ce n'est pas parce que des incapables ont bossés sur ce projet que tu dois nettoyer leurs merdes.
si c'était si simple que ça :lol:
tu crois vraiment à ce que tu dis ? qu'un pauvre stagiaire peut exiger une refonte du produit principal de la boite, même si c'est parfaitement justifié ?
ce qui veut dire bloquer les développements

je ne sais pas dans quel monde tu vis, mais à mon avis c'est tout le principe du travail : quand un chef te dit de faire, tu fais
tu peux essayer d'argumenter, mais s'il insiste c'est lui qui décide, c'est le principe d'un chef

alors dans le contexte d'un stage...
j'aimerai bien faire ça, parceque ça me saoule de faire avec les varchar, mais déjà ces varchar ne gênent pas le responsable technique plus que ça, et ils ne bloqueront pas le développement de leur produit pour tout reprendre, même si ce serait mieux

il faut quand même tenir compte de la réalité :)

par pjl » 04 juin 2005, 12:02

ce n'est pas une question d'être plus pratique ou pas.
Une date se stocke dans un champ au format date.
Point barre.
Ce n'est pas parce que des incapables ont bossés sur ce projet que tu dois nettoyer leurs merdes.

par ouckileou » 04 juin 2005, 11:59

tu rigoles ou quoi

faut pas exagérer
je l'ai fait remarquer, j'ai dit que mon code était super lourd du fait que tous les tris étaient en PHP

maintenant, penses-tu vraiment que je peux aller le voir au bout d'une semaine et lui dire :
"les champs là ne sont pas du bon type, il faut les passer en Date car ce sera plus pratique pour moi et pour vous
oui bon forcément ça veut dire qu'il faut reprendre tous les scripts, changer les insertions, virer les conversions bref reprendre un peu mais bon c'est l'affaire d'un bon mois rien de plus"

ah oui c'est une appli liée au tourisme, donc qui utilise plein de dates

alors franchement ce que tu me dis de faire n'est pas réaliste

je lui ai dit, je lui ai expliqué ce que j'en pensais, maintenant eux préfèrent les varchar, il n'a pas v raiment donné de justification et il n'y en a pas
mais je ne peux pas changer toute l'appli, c'est fait c'est fait...

changer de tournevis ok c'est pas long, mais là il faut plutôt changer toutes les vis pour coller au tournevis que j'ai et ça, ça n'est pas possible ;)

par pjl » 04 juin 2005, 11:52

et alors, ou est le problème ?
Tu vas voir ton maitre de stage et tu lui dis.

Si demain, je dois faire un stage en menuiserie et que l'on me file un tournevis droit pour visser des vis à empreinte philips, j'irai voir mon maitre de stage pour lui dire que je ne peux pas viser avec ce tournevis là, je lui expliquerai les inconvéniants (déformation de la tête de la vis, vis pas assez serrée) et les solutions (pret ou achat d'un tournevis cruciforme).

par ouckileou » 04 juin 2005, 11:46

héhé je l'attendais celle là et ça m'étonne qu'elle ne soit pas venue plus tôt :lol:

tout simplement parceque je suis en stage, et que la base est utilisée et bien remplie
donc je fais avec ce que j'ai ;)

par pjl » 03 juin 2005, 18:44

c'est gentil, mais tu as oublié que mes champs sont de type VARCHAR !! :wink:
et pourquoi ne pas mettre le champ au format date ?

par Cyrano » 02 juin 2005, 12:51

Non, en fait, je viens de voir autre chose qui ruine l'idée:
CAST() et CONVERT() sont disponibles depuis MySQL 4.0.2.

par ouckileou » 02 juin 2005, 12:41

j'avais regardé du coté de Cast() et Convert(), mais je n'ai rien vu qui laissait penser que l'on pouvait convertir une chaine vers une date

tu crois que c'est possible ?

si je lis bien, Cast ne sert que sur les types suivants :
BINARY, CHAR, DATE, DATETIME, SIGNED {INTEGER}, TIME, UNSIGNED {INTEGER}

par Cyrano » 02 juin 2005, 12:35

Alors fais un CAST pour les traiter comme des dates