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

Comment passer de lignes par dates à des lignes par période [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 04-06-2020 à 23:54:28    

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

Reply

Marsh Posté le 04-06-2020 à 23:54:28   

Reply

Marsh Posté le 05-06-2020 à 11:25:39    

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

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

Reply

Marsh Posté le 30-05-2021 à 18:45:26    

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
Reply

Marsh Posté le 31-05-2021 à 08:40:59    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed