Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
1201 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Comment passer de lignes par dates à des lignes par période

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL] Comment passer de lignes par dates à des lignes par période

n°2355272
samsa81
Posté le 04-06-2020 à 23:54:28  profilanswer
 

Bonjour,
 
Tout à fait débutante en SQL, je n'arrive pas à coder quelquechose que je vous décris ci-dessous :
 
Je pars d'une table "ma_table_1" contenant les données suivantes (c'est un exemple simplifié) :
 
ma_table_1
Date                 Ville               Prenom    Valeur
31/03/18        Paris              Marie           1
30/06/18        Paris              Marie           1
30/09/18        Paris              Marie           0
31/12/18        Paris              Marie           0
30/06/19        Paris              Marie           1
31/03/19        Toulouse           Marie           1
30/09/19        Toulouse           Marie           0
31/12/19        Toulouse           Marie           1
31/03/30        Toulouse           Marie           1
31/03/18        Paris              Paul            1
30/09/19        Paris              Paul            1
31/12/19        Paris              Paul            0
etc...
 
Je cherche à obtenir la table suivante (c'est-à-dire en groupant les lignes par période sans que ces périodes ne se chevauchent) :
DateDebut          DateFin              Ville                Prenom               Valeur
31/03/18            30/06/18           Paris              Marie                    1
30/09/18            31/12/18           Paris              Marie                    0
30/06/19            30/06/19           Paris              Marie                    1
31/03/19            31/03/19           Toulouse           Marie                    1
30/09/19            30/09/19           Toulouse           Marie                    0
31/12/19            31/03/30           Toulouse           Marie                    1
31/03/18            30/09/19           Paris              Paul                     1
31/12/19            31/12/19           Paris              Paul                     0
 
Dans la table de départ, j'ai une situation détaillée par date. Exemple avec (Paris, Marie):
ca vaut 1 sur 31/03/18,
1 sur 30/06/18
0 sur 30/09/18
0 sur 31/12/18
1 sur 30/06/19
Chaque ligne de la table porte sur 1 et une seule date.
Je veux exprimer les mêmes infos mais par période au lieu de par date.
Dans la table d'arrivée il y aurait donc, à la place de la colonne "Date", deux colonnes "Date début de période" et "Date fin de période".
 
J'ai essayé en codant ceci :
insert into ma_table_finale            
 select min(f.Date), max(f.Date), f.Ville, f.Prenom, f.Valeur
        from ma_table_initiale f
 group by f.Ville, f.Prenom, f.Valeur;
 
Mais j'obtiens évidemment une table dans laquelle les périodes se chevauchent :
DateDébut          DateFin              Ville             Prenom               Valeur
31/03/18            30/06/19           Paris           Marie                   1
30/09/18            31/12/18           Paris           Marie                   0
31/03/19            31/03/30           Toulouse        Marie                   1
30/09/19            30/09/19           Toulouse        Marie                   0
31/03/18            30/09/19           Paris           Paul                    1
31/12/19            31/12/19           Paris           Paul                    0
 
Auriez-vous une idée de comment coder cela?
Merci beaucoup à ceux qui me répondront,
S

mood
Publicité
Posté le 04-06-2020 à 23:54:28  profilanswer
 

n°2355291
flo850
moi je
Posté le 05-06-2020 à 11:25:39  profilanswer
 

c'est pas trivial, mais pas impossible

 
Code :
  1. SELECT Date AS DateDebut, /*jusqu'ici , tout va bien */
  2. (SELECT MIN(Date) FROM ma_table_1 AS tableDateFin WHERE  ma_table_1.ville = tableDateFin AND tableDateFin.Prenom = ma_table_1.prenom /* faut il ajouter une condition sur valeur ? */
  3. AND tableDateFin.date > ma_table_1.date) AS dateFin ,
  4. ville,
  5. Prenom,
  6. valeur
  7. FROM ma_table_1
 

dans ce cas dateFin peut etre nul, donc il faut ajouter un COALESCE  (ou equivalent suivant ton système de base de données) pour utiliser datedebut


Message édité par flo850 le 05-06-2020 à 11:25:51

---------------


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Comment passer de lignes par dates à des lignes par période

 

Sujets relatifs
requête SQL en phpSQL DISTINCT requete spéciale (POSTGRESQL)
Passer les guillemets dans un SELECT Potgresql #%@* WTF !!Sql Server Jointure entre table sur 2 BDD
[SQL][SGBD] Base sur le SGBD ?Conversion plusieurs lignes dans une cellule en plusieurs cellules
SQL: Bonnes pratiques et conventionsRegrouper plusieurs lignes d'une seule table avec un ID commun
MSSQL Obtenir les dates du début du mois en cours jusqu’à hierbash- recherche lignes dans bloc et affichage dans tableau
Plus de sujets relatifs à : [SQL] Comment passer de lignes par dates à des lignes par période


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR