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 PostgreSQL Discussion :

[postgreSQL] requête pivot


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    cedrix57
    Invité(e)
    Par défaut [postgreSQL] requête pivot
    Bonjour,

    J'ai des difficultés pour faire une requête. Voici à quoi ressemble ma base de données :
    Aliment(idAliment, nomAliment, glucide, proteine, graisse)
    Nutriment(idNutriment, nomNutriment)
    NutrimentAliment(idAliment$, idNutriment$, quantité, ecartType, effectifEstimation)

    Pour simplifier le problème, je cache beaucoup d'attributs.
    Voici un exemple d'Aliment : ('01', 'pomme', '10', '2', '0.1') //oui comme il s'agit d'une base de données importé, et que je n'ai pas eu le courage de la retoucher, tous les types sont CHAR(200), et aucune contrainte n'est encore définie
    Voici deux exemple de Nutriment : ('01', 'lysine'), ('02', 'Glutamine')
    Voici deux exemple de NutrimentAliment : ('01', '01', '0.02', '0.01', '50'), ('01', '02', '0.013', '0.009', '50')

    En gros, un aliment est décrit par plusieurs caractéristiques. Il y a ceux faciles à estimer, et ceux moins faciles. Ces derniers sont enregistrés dans la table NutrimentAliment, dans laquelle on ajoute des indicateurs permettant de voir la fiabilité d'une estimation.

    Dans un premier temps, j'ignore ces indicateurs, et j'aimerai bien récupérer les données sous la forme d'une table qui contient tous les les attributs de la table Aliment. Et j'aimerai bien rajouter à cette table une colonne pour chaque ligne de la table Nutriment, ayant pour nom la valeur de nomNutriment de la ligne. Les valeurs seront celles de quantité de NutrimentAliment

    Voici la table que je souhaiterai obtenir avec les exemple précédents :
    NouvelleTable(idAliment, nomAliment, glucide, proteine, graisse, lysine, glutamine)
    avec pour valeur :
    ('01', 'pomme', '10', '2', '0.1', '0.02', '0.013')

    Quelqu'un aurait une idée ?

    Merci d'avance
    Dernière modification par Antoun ; 19/02/2010 à 23h55.

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Par défaut
    Bonjour,

    Je ne vois pas vraiment l'interet de ne pas conserver la modélisation telle que vous l'importez, qui semble bien meilleure.
    Pour la requête, vous pouvez passer par un pivot, mais ça suppose de créer une colonne pour chaque nutriment existant, ou du moins ceux que vous voulez garder :
    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
     
    SELECT 
           a.idaliment,
           a.nomaliment,
           CAST(a.glucide AS NUMBER) AS glucide,
           CAST(a.proteine AS NUMBER) AS proteine,
           CAST(a.graisse AS NUMBER) AS graisse,
           max(CASE WHEN n.nomnutriment = 'lysine' THEN CAST(na.quantite AS NUMBER) ELSE 0 END) AS lysine,
           max(CASE WHEN n.nomnutriment = 'Glutamine' THEN CAST(na.quantite AS NUMBER) ELSE 0 END) AS glutamine
           ...
    FROM aliment a
    LEFT JOIN nutriment_aliment na ON na.idaliment = a.idaliment
    LEFT JOIN nutriment n ON n.idnutriment = na.idnutriment
    GROUP BY 
           a.idaliment,
           a.nomaliment,
           a.glucide,
           a.proteine,
           a.graisse;

  3. #3
    cedrix57
    Invité(e)
    Par défaut
    Merci beaucoup je vais essayer.

    Ce qui me fait peur, c'est que j'ai en réalité 50 attributs dans ma table aliment, et plus de 250 lignes dans la table Nutriment
    Je vais faire un petit script Python pour générer la requête.

    Sinon, je modifie temporairement la modélisation pour exporter la nouvelle table en format csv, le temps de faire quelques statistiques avec Python.
    Je pense que les algorithmes seront simplifiés.

    Voici le genre de calcul que je dois faire :
    Un aliment possède un certaine quantité de protéine. Ces protéines existent sous plusieurs formes. Une vingtaine peut être distinguée, tel que par exemple la 'lysine' et la 'Glutamine'.
    Pour un aliment donné, je dois calculer le minimum de 9 types de ces protéines, et diviser ce nombre par la somme des 20 types de protéines. En divisant ce nombre par le même obtenu avec l'aliment 'oeuf', j'obtiens ce qu'on appel indice chimique.
    Ensuite je peux avoir besoin de classer des aliments par indice chimique.
    Je peux aussi avoir besoin de calculer cet indicateur pour une combinaison d'aliments, et trouver quels sont les proportions d'une combinaison d'aliments qui maximise mon indice.

    Du coup je me pose une question : la modélisation précédente pourrai-t-elle être plus adaptée pour faire ce type de calcul ? surtout que pour le projet que je réalise, il est important que les calculs soient fait rapidement.

Discussions similaires

  1. Créer une requête « PIVOT » en PostgreSQL.
    Par Daïmanu dans le forum PostgreSQL
    Réponses: 7
    Dernier message: 30/12/2014, 21h26
  2. Sql server requête pivot sans somme
    Par merlin3d dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/03/2010, 11h19
  3. Requête Pivot pour débutant
    Par arthuro45 dans le forum Développement
    Réponses: 4
    Dernier message: 08/02/2010, 15h05
  4. [postgresql] Requête sans résultat
    Par speedev dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 08/11/2007, 14h01
  5. Requêtes pivots sous MS-SQL Server
    Par Thony_7 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 11/05/2007, 16h45

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