IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes MySQL Discussion :

GROUP BY complexe


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juillet 2006
    Messages : 232
    Points : 79
    Points
    79
    Par défaut GROUP BY complexe
    bonjour à tout le Monde,

    J'ai une table t avec la structure suivante
    val1,val2,val3,id,categorie dont voici une exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    1	2	4	1001	100
    2	3	5	1002	100
    1	2	4	1003	100
    1	2	4	1004	100
    8	6	2	1005	100
    1	2	4	1006	100
    4	6	8	1007	100
    1	2	4	1008	100
    ma question est la suivante: est ce que je peux faire un group by sur la basé à la fois sur categorie et le classement des valeurs numériques de val1,val2 et val3?

    Dans l'exmple précédent on a toujours val1< val2<val3 pour toutes les lignes sauf la cinquième.

    Y a-il une requête qui fasse celà.

    Merci d'avance





    donc je veux faire un group by sur la clé et l'ordonnancement des 3 vals

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Un regroupement (GROUP BY) suppose qu'on va agréger les données des lignes correspondant au critère de regroupement pour en tirer une opération (SUM, COUNT, AVG).

    Ça ne semble pas correspondre à votre besoin. Que voulez vous faire exactement ? Que souhaitez-vous comme résultat à partir de votre jeu de données exemple et pourquoi ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juillet 2006
    Messages : 232
    Points : 79
    Points
    79
    Par défaut
    Bonjour CinePhil et merci de cette réponse rapide,

    C'est tout à fait exact.
    Justement c'est un count des lignes ayant une même catégorie et avec un même ordonnancement des valeurs val1,val2 et val3 que je veux.

    Pour vous donner une idée de ce que je faisais avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT distinct count(*) as n ,categorie,id,val1,val2,val3 FROM matable group by concat(categorie,val1,val2,val3) having n>1
    Donc avant je regrouper par (categorie,val1,val2,val3). A présent je veux faire ce même type de regroupement mais en l'étendant aux valeurs avec un même ordonnancement.


    Merci infiniment.

  4. #4
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    La requête que tu indiques n'est pas correcte.

    - D'une part tu ne met pas de fonction d'agrégation sur les champs qui ne sont pas dans le GROUP BY. MySQL peut être permissif la dessus, mais cela signifie que les valeurs remontées sont difficilement interprétables.
    - D'autre part le GROUP BY concat() est assez surprenant. Pourquoi ce concat ? Selon les plages de valeurs de tes catégories et valeurs tu peux avoir des résultats erronés (ex : (categ, val1, val2, val3) = (100, 11, 22, 33) et (1001, 1, 22, 33) -> même concat )

    Pour ton problème il faut que tu transformes tes val1, val2, val3 en un indicateur de classement.
    Ex :
    • Si val1<val2<val3 --> 1
    • Si val1<val3<val2 --> 2
    • ...


    Tu peux créer une fonction pour cela que tu utiliseras dans ta requête pour une meilleur lisibilité.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT count(*) as n, categorie, getClassement(val1,val2,val3)
    FROM maTable
    GROUP BY categorie, getClassement(val1,val2,val3)
    Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

    La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

    (\ _ /)
    (='.'=)
    Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  5. #5
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juillet 2006
    Messages : 232
    Points : 79
    Points
    79
    Par défaut
    Bonjour Drizzt [Drone38],
    Ta remarque est pertinente et l'exemple que tu as donné est clair. Il faut dire que je n'ai pas pensé à ça

    Au début j'avais besoin de grouper juste les valeur et catégorie qui se ressemble, et la première chose qui m'est venue est la fonction concat. Peut être qu'on contournerait mieux en mettant des * entre les valeurs à concatener? En tout cas un très grand merci déjà.

    Aurais tu une solution mieux adaptée à mon cas?

    Merci en tout cas.

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Il vous a indiqué une solution mieux adaptée a votre cas.

    Il parlait il me semble de quelque chose comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT
        categorie
        ,COUNT(*)
    FROM matable
    GROUP BY 
        categorie
        ,
            CASE WHEN val1 < val2 THEN 1 ELSE 0 END
          + CASE WHEN val1 < val3 THEN 2 ELSE 0 END
          + CASE WHEN val2 < val3 THEN 4 ELSE 0 END

  7. #7
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    La requête ci-dessous donnera la position de val1, val2 et val3 par ligne, si ces trois sont systématiquement différentes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    SELECT  id, categorie, val1, val2, val3,
    	CASE
    		WHEN val1 < val2 AND val1 < val3 THEN 1
    		WHEN val1 > val2 AND val1 > val3 THEN 3
    		ELSE 2
    	END AS pos_val1,
    	CASE
    		WHEN val2 < val1 AND val2 < val3 THEN 1
    		WHEN val2 > val1 AND val2 > val3 THEN 3
    		ELSE 2
    	END AS pos_val2,
    	CASE
    		WHEN val3 < val1 AND val3 < val2 THEN 1
    		WHEN val3 > val1 AND val3 > val2 THEN 3
    		ELSE 2
    	END AS pos_val3
    FROM matable
    La requête suivante fait le regroupement sur la catégorie et la position des 3 valeurs mais ne donne pas ces valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    SELECT tmp.categorie, tmp.pos_val1, tmp.pos_val2, tmp.pos_val3, COUNT(*) AS nb
    FROM
    (
    	SELECT  id, categorie, val1, val2, val3,
    		CASE
    			WHEN val1 < val2 AND val1 < val3 THEN 1
    			WHEN val1 > val2 AND val1 > val3 THEN 3
    			ELSE 2
    		END AS pos_val1,
    		CASE
    			WHEN val2 < val1 AND val2 < val3 THEN 1
    			WHEN val2 > val1 AND val2 > val3 THEN 3
    			ELSE 2
    		END AS pos_val2,
    		CASE
    			WHEN val3 < val1 AND val3 < val2 THEN 1
    			WHEN val3 > val1 AND val3 > val2 THEN 3
    			ELSE 2
    		END AS pos_val3
    	FROM matable
    ) tmp
    GROUP BY tmp.categorie, tmp.pos_val1, tmp.pos_val2, tmp.pos_val3
    Pas sûr que ça réponde à 100% à ton souhait mais ça peut te donner une piste.

    Bon courage !
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Âge : 49

    Informations forums :
    Inscription : Juillet 2006
    Messages : 232
    Points : 79
    Points
    79
    Par défaut
    Merci de ces explications.

    Je fais les tests et je vous informe.

    Mais ça me semble tout à fait convenir à mon besoin.

    Merci.

Discussions similaires

  1. Requête Group By Complexe
    Par erictomcat dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2013, 16h49
  2. Dénombrement temporel groupé complexe
    Par fanfouer dans le forum Langage SQL
    Réponses: 20
    Dernier message: 29/03/2011, 00h15
  3. Requète Complexe avec GROUP BY et classement descendant
    Par snoups58 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/10/2008, 18h44
  4. Réponses: 6
    Dernier message: 14/06/2008, 17h46
  5. Création d'une vue sous SQL Server - group by complexe
    Par csembeil dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 12/01/2006, 16h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo