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

PostgreSQL Discussion :

Modifier des colonnes (novice)


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Modifier des colonnes (novice)
    Bonjour à tous,

    Disposant d'une base de données s'appellant "mobil_pro", je souhaite la modifier pour partir de ça ...

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    path ; cost; sexe
    42-60 ; 12; male
    42-60; 5; female
    42-61; 3.59; male
    42-62; 13.85; male
    42-62; 2.96; female


    ... à ça.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    path; male; female
    42-60 ; 12; 5;
    42-61; 3.59; 0
    42-62; 13.85; 2.96


    Je sais que l’utilisation de array_agg serait bien dand cette situation, mais je ne vois pas trop la syntaxe qu'aura la requête.

    Merci à vous.

  2. #2
    Expert éminent sénior
    Bonsoir

    Quelques questions
    - pouvez-vous communiquer le script complet de création de la table actuelle (ordre CREATE TABLE avec toutes ses colonnes et contraintes)
    - est-ce que pour une valeur de "path " il existe toujours une et une seule valeur de mâle et une et une seule valeur de femelle ?
    - peut il exister des valeurs de "path" pour lesquelles il y a des valeurs qui ne correspondent ni à "mâle" ni à "femelle" ("inconnu" par exemple)
    Si la réponse à l'une des deux dernières questions est oui, alors le modèle que vous proposez est inadapté

  3. #3
    Membre du Club
    Citation Envoyé par escartefigue Voir le message
    Bonsoir

    Quelques questions
    - pouvez-vous communiquer le script complet de création de la table actuelle (ordre CREATE TABLE avec toutes ses colonnes et contraintes)
    - est-ce que pour une valeur de "path " il existe toujours une et une seule valeur de mâle et une et une seule valeur de femelle ?
    - peut il exister des valeurs de "path" pour lesquelles il y a des valeurs qui ne correspondent ni à "mâle" ni à "femelle" ("inconnu" par exemple)
    Si la réponse à l'une des deux dernières questions est oui, alors le modèle que vous proposez est inadapté
    Merci pour votre réponse.

    - Cette table provient d'un pré-filtre que j'ai réalisé sur la base de donnée "Mobilité professionnelle" de l'INSEE. Voici la requête que j'ai tapé.

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
     
    select distinct departement_commune || ' - ' || departement_dclt as path, ipondi as cost, sexe
    from mobil_pro


    Ceci afin de concaténer les champs départ/arrivé, et de ne garder que les coûts des individus et leur sexe. Je n'ai pas le script sous la main, vu que c'est juste un import du CSV disponible sur le site de l'INSEE.

    Voici le .sql de la table entière : https://drive.google.com/open?id=1HZ...l7-MhgKuSc7q4I

    - J'ai peur de ne pas avoir compris la question. En soit, il existe des valeurs de path où Male OU Femelle est null. Dans ce cas, ça correspond à un trajet effectué uniquement par des individus masculins ou que des individus féminins.

    - Non, il n'existe aucune valeur de Path dans laquelle la valeur de Male ET Femelle sont nulles.

    Un grand merci à vous.

  4. #4
    Membre éprouvé
    Ahh si postgres avait pivot

  5. #5
    Expert éminent sénior
    Citation Envoyé par preliator Voir le message
    Voici le .sql de la table entière : https://drive.google.com/open?id=1HZ...l7-MhgKuSc7q4I
    Malheureusement c'est illisible


    Citation Envoyé par preliator Voir le message

    - J'ai peur de ne pas avoir compris la question. En soit, il existe des valeurs de path où Male OU Femelle est null. Dans ce cas, ça correspond à un trajet effectué uniquement par des individus masculins ou que des individus féminins.
    - Non, il n'existe aucune valeur de Path dans laquelle la valeur de Male ET Femelle sont nulles.
    Ceci ne répond que partiellement à ma question, vous ne précisez pas si on peut avoir plusieurs valeurs mâle et/ou plusieurs valeurs femelle pour un même path

  6. #6
    Membre du Club
    Ah ! D'accord.
    Dans ce cas non , il n'y a pas plusieurs valeurs pour une seule valeur de Path

  7. #7
    Expert éminent sénior
    Alors une solution possible :

    Jeu de test :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    with t1 (Cid, Cpath, Ccost, Csex) as
        (select 1, '42-60', 012.00, 'male  '   union all
         select 2, '42-60', 005.00, 'female'   union all
         select 3, '42-61', 003.59, 'male  '   union all
         select 4, '42-62', 013.85, 'male  '   union all
         select 5, '42-62', 002.96, 'female'   union all
         select 6, '66-77', 020.55, 'female'
        )


    Requête :
    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 coalesce(TM.Cpath, TF.Cpath) as Xpath
         , tm.ccost as mcost
         , tf.ccost as fcost
    from (select Cpath
               , max(Ccost) as ccost
          from t1
          where Csex='male  '
          group by Cpath
         ) as TM
    full outer join
         (select Cpath
               , max(Ccost) as ccost
          from t1
          where Csex='female'
          group by Cpath
         ) as TF
      on TF.Cpath=TM.Cpath


    Résultat
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Xpath	mcost	fcost
    42-60	12.00	5.00
    42-61	3.59	
    42-62	13.85	2.96
    66-77		20.55

  8. #8
    Membre du Club
    Un grand merci a vous

  9. #9
    Modérateur

    Ou plus simplement :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      select Cpath
           , max(case Csex when 'male  ' then Ccost end) as male
           , max(case Csex when 'female' then Ccost end) as female
        from t1
    group by Cpath
    order by Cpath asc;

  10. #10
    Membre du Club
    Merci beaucoup !
    Est-ce possible d'utiliser array_agg dans cette situation ?

  11. #11
    Modérateur

    Vous pourriez si vous voulez complexifier (inutilement) votre solution.
    ARRAY_AGG comme son nom l'indique sert à agréger des tableaux, ici vous n'avez rien de tout ça.

###raw>template_hook.ano_emploi###