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 :

Requête "à deux dimensisons"


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Homme Profil pro
    ingénieur
    Inscrit en
    Décembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 20
    Points : 9
    Points
    9
    Par défaut Requête "à deux dimensisons"
    Bonjour à tous.
    Je fait ici appel à l'aide de ce merveilleux forum.

    Voila ma situation : J'ai une base de donnée qui contient des valeurs du type :


    Nom : table.PNG
Affichages : 178
Taille : 5,5 Ko


    J'aimerai trouver une requête (et éventuellement un traitement php derrière, ce qui me semble presque obligatoire... ) qui me permettrai de retourner un résultat du type :


    Nom : results.PNG
Affichages : 158
Taille : 1,9 Ko

    qui me renvoi donc la somme du coût par type et par année (sachant bien évidemment que le nombre de type et le nombre d'année sera variable en fonction du remplissage de la table par les utilisateurs, et que j'aimerai également avoir la possibilité de classer par sous_type et non par type uniquement)

    Quelle serait la meilleur solution pour arriver à mon résultats souhaitez ?

    Merci à tous ceux qui voudrons bien m'aider.

  2. #2
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Bonsoir,

    Si Mysql utilisé, regarder du coté group_concat ...
    https://mysql.developpez.com/faq/?pa...ent-l-utiliser
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 803
    Points
    30 803
    Par défaut
    Le mot clé est PIVOT.
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    ingénieur
    Inscrit en
    Décembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Le mot clé est PIVOT.
    Bonjour.

    merci pour cette réponse

    la solution me parait effectivement etre ce que je recherche, mais malgré tous mes efforts la requête est jugée non conforme par MySQL (je suis sous phpMyadmin sous wamp). est-ce qu'il y a des limitations sur l'utilisation de PIVOT ?

    J'ai une erreur autour de FROM (pour la requête pivotèe, prêt de PIVOT et dans les colonnes après IN...
    Peut être auriez vous la gentillesse de m'aider à construire une requête type adaptée à mon besoin ? ^^

    Merci encore

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    Citation Envoyé par al1_24
    Le mot clé est PIVOT
    Bon sang, mais c'est bien sûr Bernard !

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`      integer  unsigned  NOT NULL auto_increment primary key,
      `date`    date               NOT NULL,
      `type`    smallint unsigned  NOT NULL,
      `cout`    integer  unsigned  NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`date`,`type`,`cout`) values
      ('2018-01-01', 1, 10),
      ('2018-01-01', 2,  5),
      ('2017-01-01', 1,  7),
      ('2018-01-01', 1,  2),
      ('2018-01-01', 3, 15),
      ('2017-01-01', 3, 20),
      ('2018-01-01', 2, 10),
      ('2017-01-01', 1,  5)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+------------+------+------+
    | id | date       | type | cout |
    +----+------------+------+------+
    |  1 | 2018-01-01 |    1 |   10 |
    |  2 | 2018-01-01 |    2 |    5 |
    |  3 | 2017-01-01 |    1 |    7 |
    |  4 | 2018-01-01 |    1 |    2 |
    |  5 | 2018-01-01 |    3 |   15 |
    |  6 | 2017-01-01 |    3 |   20 |
    |  7 | 2018-01-01 |    2 |   10 |
    |  8 | 2017-01-01 |    1 |    5 |
    +----+------------+------+------+
    --------------
    select    `type`,
              sum(case when year(`date`) = 2017 then `cout` else 0 end) as A2017,
              sum(case when year(`date`) = 2018 then `cout` else 0 end) as A2018
        from  `test`
    group by  `type`
    --------------
     
    +------+-------+-------+
    | type | A2017 | A2018 |
    +------+-------+-------+
    |    1 |    12 |    12 |
    |    2 |     0 |    15 |
    |    3 |    20 |    15 |
    +------+-------+-------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Bonjour,
    Je cite "... sachant bien évidemment que le nombre de type et le nombre d'année sera variable en fonction du remplissage de la table par les utilisateurs ..."
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  7. #7
    Futur Membre du Club
    Homme Profil pro
    ingénieur
    Inscrit en
    Décembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Bonjour.

    Tout d'abord, merci à tous pour vos réponses et votre aide ^^.

    Effectivement Artemus24 ta solution me parait parfaitement fonctionnelle, je t'en remercie !

    Mais comme l'a justement fait remarquer vttman, je vais avoir un nombre très variable d'année. Mais ce n'est que la partie immergé de l'Iceberg. Dans la finalité, j'aimerai également que les utilisateurs puisse trier par mois, par années, par période de 6 mois, etc... en fonction de leurs besoins (je ne me suis pas étendu sur cette partie car je ne voulais pas complexifier l’énoncé ^^ ). Alors certes je pourrais passer un peu de temps à essayer de construire mes requêtes SQL via mon contrôleur php. Mais au vu de la complexité que j'attend, je pense que ce serait une erreur. Trop lourd à entretenir.

    la fonction PIVOT me parait vraiment adéquate à mon besoin, mais je n'arrive pas à la faire fonctionner. un cas concret sur lequel j'ai essayer de me faire la main (vous l'aurez compris je suis loin d'être expert en la matière ! ) : Seulement à force de recherche j'ai l'impression que l'opérateur "PIVOT" ne peut s'utiliser que sous SQL Server ... ?

  8. #8
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    Citation Envoyé par vttman
    Je cite "... sachant bien évidemment que le nombre de type et le nombre d'année sera variable en fonction du remplissage de la table par les utilisateurs ..."
    Vous savez très bien que l'on ne peut pas gérer avec MySql, un nombre de colonnes variables.
    La solution que je propose est basée sur l'affichage des résultats attendus par yulione.

    Citation Envoyé par yulione
    Mais comme l'a justement fait remarquer vttman, je vais avoir un nombre très variable d'année.
    J'ai fourni un résultat en fonction de votre demande.

    Citation Envoyé par yulione
    Dans la finalité, j'aimerai également que les utilisateurs puisse trier par mois, par années, par période de 6 mois, etc...
    Vous n'avez pas formulé cette autre demande.

    Citation Envoyé par yulione
    je ne me suis pas étendu sur cette partie car je ne voulais pas complexifier l’énoncé ^^
    C'est un tort car vous simplifiez votre demande et après, vous constatez, que cela ne vous convient pas.

    Citation Envoyé par yulione
    Mais au vu de la complexité que j'attends, je pense que ce serait une erreur. Trop lourd à entretenir.
    Commencez par poser le problème, sans simplifier quoi que ce soit.
    Donnez un jeu d'essai réel et complet, représentatif de votre difficulté.
    Donnez les résultats que vous attendez.

    Si votre problème est une question de présentation, c'est sous php que vous devrez résoudre ce problème et non sous mysql.
    Comme je l'ai indiqué ci-dessus, on ne peut pas produire un nombre de colonnes variables sous MySql.
    Une possible solution est de fournir un nombre fixe, même si cela produit des résultats vides.

    Pour le pivot :
    --> https://stackoverflow.com/questions/...ql-pivot-table

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  9. #9
    Futur Membre du Club
    Homme Profil pro
    ingénieur
    Inscrit en
    Décembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Désolé je ne voulais vexer personne ^^

    et si j'ai poser la question telle que je l'ai posée c'est que je préfère comprendre le concept et l'adapter à mon besoin, plutôt que d'avoir une solution toute mâchée. j'aime la démarche de recherche de solution. La je me suis retrouvé dans une impasse.
    Mais votre aide devrait suffire à répondre à mon besoin. je vais explorer cette voie là.

    Je suis toujours ouvert à d'autre suggestion si certains en ont !

    Merci à tous

  10. #10
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut yulione.

    Citation Envoyé par yulione
    Désolé je ne voulais vexer personne ^^
    Mais je ne suis pas vexé !

    Reprenons.

    Vous donnez un jeu d'essai simpliste, avec un résultat attendu.
    Je m'empresse de vous communiquer une possible solution à partir de votre problème simplifié.

    Maintenant, vous dites que cela ne vous convient pas. D'accord.
    Mais en quoi la solution que je propose n'est pas conforme au problème que vous nous avez indiqué dans votre premier message ?

    Dans ce cas, votre jeu d'essai, trop simpliste, n'est pas conforme à votre problème.
    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE IF NOT EXISTS `base`
            DEFAULT CHARACTER SET `latin1`
            DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `test`
    --------------
     
    --------------
    CREATE TABLE `test`
    ( `id`      integer  unsigned  NOT NULL auto_increment primary key,
      `date`    date               NOT NULL,
      `type`    smallint unsigned  NOT NULL,
      `cout`    integer  unsigned  NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `test` (`date`,`type`,`cout`) values
      ('2018-01-01', 1, 10),
      ('2018-01-01', 2,  5),
      ('2017-01-01', 1,  7),
      ('2018-01-01', 1,  2),
      ('2018-01-01', 3, 15),
      ('2017-01-01', 3, 20),
      ('2018-01-01', 2, 10),
      ('2017-01-01', 1,  5)
    --------------
     
    --------------
    select * from `test`
    --------------
     
    +----+------------+------+------+
    | id | date       | type | cout |
    +----+------------+------+------+
    |  1 | 2018-01-01 |    1 |   10 |
    |  2 | 2018-01-01 |    2 |    5 |
    |  3 | 2017-01-01 |    1 |    7 |
    |  4 | 2018-01-01 |    1 |    2 |
    |  5 | 2018-01-01 |    3 |   15 |
    |  6 | 2017-01-01 |    3 |   20 |
    |  7 | 2018-01-01 |    2 |   10 |
    |  8 | 2017-01-01 |    1 |    5 |
    +----+------------+------+------+
    --------------
    select    `type`,
              year(`date`) as annee,
              sum(cout) as cout
        from  `test`
    group by  `type`, year(`date`)
    --------------
     
    +------+-------+------+
    | type | annee | cout |
    +------+-------+------+
    |    1 |  2018 |   12 |
    |    2 |  2018 |   15 |
    |    1 |  2017 |   12 |
    |    3 |  2018 |   15 |
    |    3 |  2017 |   20 |
    +------+-------+------+
    --------------
    COMMIT
    --------------
     
    Appuyez sur une touche pour continuer...
    Comme indiqué précédemment, la présentation doit se faire en Php, à partir de l'extraction que je vous donne ci-dessus.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  11. #11
    Futur Membre du Club
    Homme Profil pro
    ingénieur
    Inscrit en
    Décembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Et ben tant mieux alors !

    hum... votre première solution m'allait mieux car dans ce dernier cas la combinaison type 2 / 2017 n'existe pas, alors que je souhaiterais qu'elle soit affiché à 0.

    Bon alors si on part sur le challenge complet voici ce que j'aimerai en détail :

    Table avec : Date / Type / sous-type / produit / nombre de produit concerné / coût1 / coût2 / coût3

    Date : n'importe quelle date, évolutif en fonction de ce que remplissent les utilisateurs
    Type : basée sur une liste de choix
    sous-type : basée sur seconde une liste de choix - spécifique au type
    produit : basée sur une liste de choix (environ 5000)

    Le coût des produits est enregistré dans une autre table (avec la référence produit pour lien).

    Je souhaiterai un tableau qui affiche


    Nom : Capture.PNG
Affichages : 160
Taille : 63,1 Ko


    Où le coût des produits est la quantité de produit détruit * le prix produit, qui est dans une autre table (et ce prix varie par années donc dans cette autre table j'ai : produit / prixannée1 / prixannée2, etc...)

    Sachant que je souhaiterai que l'utilisateur puisse :
    1 - sélectionner les plages de date à interroger ainsi que intervalle de temps (de 2015 à 2020 à intervalle de 6 mois, uniquement 2018 à intervalle d'un mois, etc).
    2-Selectionner uniquement certains type ou sous-type
    3-afficher ou masquer certaines colonne, le coût2 par exemple.
    4-Grouper par produit au lieu de par type ou par sous-type (produit/type/sous/type ou alors type/produit/sous-type)
    5-ne pouvoir groupe que sur un ou deux critère (Type uniquement ou bien type/sous-type mais plus produit)


    J'ai déjà la solution pour la plupart de ma problématique, mais pas sur la bonne manière de récupérer mes données en SQL....


    Voila le micmac... du coup si vous avez de l'aide à m'apporter ^^

  12. #12
    Futur Membre du Club
    Homme Profil pro
    ingénieur
    Inscrit en
    Décembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Du coup quand j'expose mon problème au complet plus personnes répond ?

    J'aimerai juste la meilleur façon de faire ma requête par rapport à mon besoin. Le reste du code (php, etc,) je vais me débrouiller.

  13. #13
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Les pivots sont rarement utilisés car le besoin est en général résolu coté application.

    Voici un lien vers un article bien documenté qui propose plusieurs solutions. Il est dédié à SQL Server mais vous pourrez adapter à votre besoin

    https://fadace.developpez.com/mssql/pivot/

  14. #14
    Futur Membre du Club
    Homme Profil pro
    ingénieur
    Inscrit en
    Décembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 20
    Points : 9
    Points
    9
    Par défaut
    Bonjour.

    Merci pour ce lien, je vais regarder cela avec grand intérêt.

    Etant donné que je pense avoir suffisament d'information pour répondre à mon besoin malgré tout, je passe le sujet en résolu.

    Merci à tous pour votre aide

Discussions similaires

  1. requêter deux fois le même champ dans une table
    Par SpaceFrog dans le forum Requêtes
    Réponses: 6
    Dernier message: 26/11/2007, 13h44
  2. effectuer en 1 requête deux instructions
    Par jonnyboy dans le forum Langage SQL
    Réponses: 6
    Dernier message: 28/09/2007, 12h00
  3. requête deux tables
    Par ptitnana dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 23/05/2007, 18h31
  4. Requête deux joueurs
    Par lebreton22 dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/02/2007, 07h07
  5. Une requête, deux tables, fonction COUNT
    Par Nerva dans le forum Requêtes
    Réponses: 8
    Dernier message: 13/04/2006, 15h10

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