Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
902 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

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

n°2386583
djinto
Posté le 30-05-2021 à 18:45:26  profilanswer
 

samsa81 a écrit :

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


 
 
Le SQL permet d'administrer ta base de données,
c'est à dire que tu peux créer , modifier , supprimer : une base , une table , gérer les roles , et les utilisateurs aussi.
 
si c'est une modification durable de la structure de ta Bdd : tu ajoutes une colonne 'fin période'
ou
un confort de lecture : une requete pour des données sera suffisante à chaque fois.
 
order by ''col 1" [default = asc ; desc ] , "col 2" desc => permet de classer les 'tuples' issus de la rêquete.
ordre décroissant ou croissant.
donc du plus petit vers le plus grand.
ou de a vers z , dans le cas de 'chaine de caractère' String.
 
ou l'inverse.
 
La méthode que tu utilises est pas moche. 0 ouvre la période ; 1 ferme la période.
tu peux rester sur cette méthode.
sauf si il s'agit d'une grosse faute de conception.
 
Tu a utilité de conserver ce 'boolèen' ?
ou c'est vraiment un 'loupé' ?
 


---------------
Nom : Prénom : Age : Adresse : Ville : Code Postal : Num Trois Tel
n°2386602
rufo
Pas me confondre avec Lycos!
Posté le 31-05-2021 à 08:40:59  profilanswer
 

Je pense que depuis le temps, le mec est passé à autre chose :D


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta

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-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR