Résumer plusieurs lignes en une seule

Résumer plusieurs lignes en une seule - SQL/NoSQL - Programmation

Marsh Posté le 02-06-2014 à 16:30:03    

Bonjour,
 
 J'ai une table qui contient 4 champs ;
 index
 p1
 p2
 p3
 
 Mon objectif est de regrouper au mieux pour avoir l'information avec le moins de lignes possibles.
 
 Voici un exemple

Code :
  1. 1201 0,802 0,05 0,07
  2. 1202 0,802 0,05 0,07
  3. 1203 0,802 0,05 0,07
  4. 1204 0,052 0,035 0,076
  5. 1205 0,802 0,05 0,07
  6. 1206 0,802 0,05 0,07
  7. 1207 0,802 0,05 0,07
  8. 1208 0,802 0,05 0,07
  9. 1209 0,802 0,05 0,07
  10. 1224 0,802 0,05 0,07
  11. 1225 0,802 0,05 0,07
  12. 1226 0,052 0,035 0,076
  13. 1228 0,802 0,05 0,07
  14. 1229 0,802 0,05 0,07
  15. 1231 0,802 0,05 0,07
  16. 1234 0,802 0,05 0,07
  17. 1236 0,052 1 0,076
  18. 1239 0,802 0,05 0,07
  19. 1240 0,802 0,05 0,07
  20. 1242 0,9653 0,398 0,66
  21. 1246 0,823729 0,8495 0,885
  22. 1248 0,802 0,05 0,07
  23. 1249 0,052 0,035 0,076
  24. 1250 0,052 0,035 0,076
  25. 1251 0,802 0,05 0,07
  26. 1252 0,802 0,05 0,07
  27. 1253 0,802 0,05 0,07
  28. 1254 0,802 0,05 0,07
  29. 1256 0,802 0,05 0,07


 
La série 120 serait donc remplacée par les 2 lignes suivantes:
120 0,802 0,05 0,07
1204 0,052 0,035 0,076
La série 122 serait donc remplacée par les 2 lignes suivantes:
122 0,802 0,05 0,07
1226 0,052 0,035 0,076
 
 
La série 123 serait donc remplacée par les 2 lignes suivantes:
123 0,802 0,05 0,07
1236 0,052 1 0,076
 
Mais la série 124 serait donc remplacée par les 4 lignes suivantes:
124 0,802 0,05 0,07
1242 0,9653 0,398 0,66
1246 0,823729 0,8495 0,885
1249 0,052 0,035 0,076
On n'y gagne qu'une seule ligne qu'on résume, les autres lignes sont laissées avec leurs détails!
 
 
 La série 125 serait donc remplacée par les 2 lignes suivantes:
1250 0,052 0,035 0,076
125 0,802 0,05 0,07
 
Cet exemple résume la philosophie des regroupements que je dois faire.
 
 Merci d'avance.

Reply

Marsh Posté le 02-06-2014 à 16:30:03   

Reply

Marsh Posté le 02-06-2014 à 17:34:48    

Je pars de l'hypothèse que ta table a la structure suivante :
- id
- col1
- col2
- col3

 

et que la série est id/10 arrondi à l'unité.

 

En jouant avec une requête imbriqué (pour le calcul des valeurs/group by) plus un case/when pour le formattage corresponds au besoin

 

Je pense qu'une requête de type

Code :
  1. SELECT
  2.      CASE
  3.           WHEN nb >1 THEN serie
  4.            ELSE min_id
  5.      END AS ref_num,
  6.      col1, col2, col3
  7. FROM (
  8.       SELECT min( id ) AS min_id, count( id ) nb, round( id /10, 0 ) AS serie, col1, col2, col3
  9.      FROM test
  10.      GROUP BY serie, col1, col2, col3
  11. ) t1
 

doit faire l'affaire non ?


Message édité par dreameddeath le 02-06-2014 à 17:39:01
Reply

Marsh Posté le 03-06-2014 à 02:01:06    

Bonjour dreameddeath,
 
Avant tout je te remercie de cette réponse rapide mais surtout de la requête qui s'est exécutée sans erreur du premier coup.
 
Mais je constate qu'elle me donne le même nombre  de lignes que dans la table test initial . Comme si les group by n'a pas fonctionné.
Pour rappel
Après le group by on voudrait que les lignes multiple soient supprimées et ne laisser que les lignes ne se répètant pas.
 
Merci infiniment

Reply

Marsh Posté le 03-06-2014 à 02:04:21    

Reply

Marsh Posté le 03-06-2014 à 08:08:44    

Si le group by n'a pas fonctionné, c'est que les décimaux ne sont pas "égaux", certainement lié à un pb d'arrondi...
 
Tu tires d'où tes données ?

Reply

Marsh Posté le 03-06-2014 à 13:54:17    

J'aurais dit de faire un distinct ou plus rapide, un group by, aussi :o


---------------
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

Marsh Posté le 03-06-2014 à 14:26:21    

C'est pas tout à fait un distinct, car visiblement il faut faire un "rapprochement" par série (sans le dernier digit de la colonne index).
 
D'où mon group by "serie", que j'ai testé chez moi "bêtement" (jeu de donnée simulé à la mimine) et ça marche.
 
Donc je ne vois que peu d'explications :
- le moteur de base de donnée
- la structure de la table (le type des colonne)
- le jeu de donnée (par exemple un décimal tronqué à l'affichage mais qui en base est plus "précis" )
 
@maestro1303 :
- pourrais-tu me dire quelle est ton SGBD
- la structure de BDD (y compris la précision des colonnes numériques)
 
Merci d'avance


Message édité par dreameddeath le 03-06-2014 à 14:26:43
Reply

Marsh Posté le 06-06-2014 à 10:45:29    

select distinct(p1,p2,p3) from ma table
ou
select p1,p2,p3 from ma table group by
p1,p2,p3
la seconde solution plus rapide mais se prête pour aussi faire un count, un min, max... pour connaitre les cardinalités de tes "doublons"...


Message édité par gpl73 le 06-06-2014 à 11:15:26

---------------
mieux vaut être un con au chaud, qu'un con gelé lol
Reply

Sujets relatifs:

Leave a Replay

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