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

Langage SQL Discussion :

Transposition des donnees en lignes


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Transposition des donnees en lignes
    Bonjour a tous,

    Je cherche à mettre 2 dates sur la même ligne pour un même client.
    Exemple :

    Client. Date achat
    A. X
    A. W
    B. Y
    C. V
    C. Z

    Transformé en:

    Client Date 1. Date 2
    A. X. W
    B. Y.
    C. V. Z

    J'ai vu qu'avec la fonction PIVOT , toute la table pivote. Donc ça ne fonctionne pas. Et en bidouillant avec le qualify row_number, j'ai toujours deux lignes par client.
    Si quelqu'un a un bout de solution, je suis preneuse.
    Merci par avance.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Bonjour,
    Est-ce qu'i n'y a que deux dates maximum ?
    Si c'est bien le cas, tu peux faire ainsi:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    select Codeclient,min(LaDate),max(LaDate)
    from Client
    group by Codeclient
    Mais tu auras toujours la date min en premier, et la date max en second.

    Tatayo.

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Tout d'abord, merci pour la réponse rapide!!
    J'ai effectivement que deux dates car je souhaite avoir les deux dernières dates renseignées. Par contre, il y a également un chiffre d'affaire associé à ces 2 dates. Comment dois-je faire pour les transposer a leur tour, sachant que je ne peux pas utiliser le min et max du chiffre d'affaire?:
    Client 1. CA_N date_N. CA_N-1 date_N-1
    Client 2. CA_N. date_N. CA_N-1 date_N-1

    Merci beaucoup !

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Attention, ma solution ne donne pas les deux dernières dates renseignées, mais la plus ancienne et la plus récente.
    Ce n'est pas du tout la même chose !

    Si en plus de veux d'autres données, ça change la donne, et la requête que j'ai donnée ne répond plus du tout à la demande.
    C'est pour ça qu'il faut donner toutes les infos dès le premier message…

    Est-ce que tu peux nous donner un jeu de test et le résultat attendu (avec toutes les colonnes) ?

    Tatayo.

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Oui, la solution ne donne pas les 2 dernières dates renseignées mais dans ma base de données, j'ai deux dates renseignées max.
    Voila ma table que j'obtiens avec mon code et celle que j'essaie d'obtenir:
    Nom : Capture.PNG
Affichages : 164
Taille : 31,2 Ko


    et mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    select id_foyer, id_client, siren, CA, date, nb_salarie, info 
    from perimetre a
    left join inform b on a.siren=b.siren
    group by 1,2,3,4,5,6,7
    Encore merci!

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    C'est la colonne CA qui provoque la sélection de toutes les dates

    Si on est certain qu'il y a toujours au plus 2 occurrences de date+CA, le plus simple est de faire une auto jointure pour récupérer les deux

    Par exemple, avec ce jeu d'essais (les 3 premiers clients ont bien deux ventes, le 4e une seule et le 5e aucune) :

    Code SQL : 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
    with T1_CLI(T1_ident, T1_nom) as 
        (select 1, 'client machin'   union all 
         select 2, 'Client Toto'     union all 
         select 3, 'Société bidule'  union all 
         select 4, 'Machin SARL'     union all
         select 5, 'Dugenou & Cie'
        ) 
       , T2_VTE(T1_ident, T2_date, T2_CA) as 
        (select 1, '2021-01-31', 0100.50 union all 
         select 1, '2021-02-28', 0080.37 union all 
         select 2, '2021-01-31', 1800.61 union all 
         select 2, '2021-03-31', 0467.24 union all 
         select 3, '2021-01-31', 0671.45 union all 
         select 3, '2021-02-28', 1030.02 union all
         select 4, '2021-06-30', 1234.56
        )

    La requête qui suit :
    Code SQL : 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 T1.T1_ident 
         , T1.T1_nom
         , T2A.T2_date as Date1
         , T2A.T2_CA as CA1
         , T2B.T2_date as Date2
         , T2B.T2_CA as CA2 
    from T1_CLI as T1 
    left join T2_VTE as T2A 
       on T2A.T1_ident=T1.T1_ident 
    left join T2_VTE as T2B 
       on T2B.T1_ident=T1.T1_ident 
      and T2B.T2_date > T2A.T2_date 
    where not exists
         (select 1 
          from T2_VTE as S2
          where S2.T1_ident=T1.T1_ident
            and S2.T2_date< T2A.T2_date
         )
    order by T1.T1_nom

    Donne le résultat attendu :
    T1_ident T1_nom Date1 CA1 Date2 CA2
    1 client machin 2021-01-31 100.50 2021-02-28 80.37
    2 Client Toto 2021-01-31 1800.61 2021-03-31 467.24
    5 Dugenou & Cie null null null null
    4 Machin SARL 2021-06-30 1234.56 null null
    3 Société bidule 2021-01-31 671.45 2021-02-28 1030.02

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci pour la réponse

    Si j'ai bien compris ton code, tu as 2 tables plutôt qu'une.

    A la base mon code est dans une requete imbriquée mais si je comprend bien: il est plus simple de creer deux tables distinctes pour faire une jointure de la table avec elle-meme, c'est ça?

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    Non, j'ai utilisé un exemple avec une table des clients et une table des ventes, mais si toutes les colonnes utiles sont dans une seule table, alors il faut utiliser le même principe avec cette table unique.

    Le jeu d'essai avec une seule table (on a perdu le nom du client que je ne l'ai pas reconduit dans la table unique) :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    with T2_VTE(T2_ident, T2_date, T2_CA) as 
        (select 1, '2021-01-31', 0100.50 union all 
         select 1, '2021-02-28', 0080.37 union all 
         select 2, '2021-01-31', 1800.61 union all 
         select 2, '2021-03-31', 0467.24 union all 
         select 3, '2021-01-31', 0671.45 union all 
         select 3, '2021-02-28', 1030.02 union all
         select 4, '2021-06-30', 1234.56
        )

    La requête correspondante :
    Code SQL : 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
    select T2A.T2_ident
         , T2A.T2_date as Date1
         , T2A.T2_CA as CA1
         , T2B.T2_date as Date2
         , T2B.T2_CA as CA2 
    from T2_VTE as T2A 
    left join T2_VTE as T2B 
       on T2B.T2_ident=T2A.T2_ident 
      and T2B.T2_date > T2A.T2_date 
    where not exists
         (select 1 
          from T2_VTE as S2
          where S2.T2_ident=T2A.T2_ident
            and S2.T2_date< T2A.T2_date
         )
    order by T2A.T2_iden
    t

    Et le résultat, trié cette fois-ci sur l'identifiant, puisque le nom du client a disparu de la table
    T2_ident Date1 CA1 Date2 CA2
    1 2021-01-31 100.50 2021-02-28 80.37
    2 2021-01-31 1800.61 2021-03-31 467.24
    3 2021-01-31 671.45 2021-02-28 1030.02
    4 2021-06-30 1234.56 null null

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2014
    Messages : 10
    Points : 6
    Points
    6
    Par défaut
    Merci le code fonctionne.
    Imaginons que je n'ai pas la date qui me permet de distinguer les lignes: comment peut on mettre le CA1 dans une colonne et le CA2 dans une autre (juste avec l'identifiant)?

  10. #10
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 136
    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 136
    Points : 38 909
    Points
    38 909
    Billets dans le blog
    9
    Par défaut
    C'est possible, mais il faut toutefois tenir compte du fait que la valeur de l'identifiant, s'il s'agit d'une colonne attribuée par le SGBD, n'est pas toujours chronologique.

Discussions similaires

  1. Presenter des donnees Excel, uun paragraphe par ligne
    Par kramer Mc Barreth dans le forum Word
    Réponses: 3
    Dernier message: 07/04/2020, 17h58
  2. Réponses: 3
    Dernier message: 03/06/2008, 17h49
  3. [Oracle 8i] Présentation des données par lignes
    Par simof1977 dans le forum Langage SQL
    Réponses: 11
    Dernier message: 10/05/2006, 18h42
  4. importer des donnees dans interbase
    Par ms91fr dans le forum InterBase
    Réponses: 3
    Dernier message: 25/11/2002, 17h43
  5. Zoom sur des vecteurs ou lignes
    Par mat.M dans le forum Algorithmes et structures de données
    Réponses: 7
    Dernier message: 25/11/2002, 10h40

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