Regrouper plusieurs résultats sur une seule ligne

Regrouper plusieurs résultats sur une seule ligne - SQL/NoSQL - Programmation

Marsh Posté le 30-07-2023 à 19:25:25    

Bonjour  :hello:  
 
Je suis face à une problématique et je n'arrive pas a trouver la solution. J'ai besoin d'extraire un paquet de données et les regrouper (extraction unique dans le cadre d'une étude). Mais je n'arrive pas a tout mettre sur la même ligne  [:canaille]  
 
En gros mon extraction au départ me donne un tableau sous la forme suivante:

Code :
  1. LOT   | ACTION           | QTY
  2. Lot A | Consommation | 200
  3. Lot A | Consommation | 100
  4. Lot A | Reintroduction  | 80
  5. Lot B | Consommation | 40
  6. Lot B | Consommation | 100
  7. Lot B | Consommation | 80
  8. Lot B | Reintroduction | 20
  9. Lot C | Consommation | 200
  10. Etc...


 
J'ai donc fait un truc du genre:
 

Code :
  1. Select LOT,
  2. case ACTION when 'Consommation' then SUM(QTY) end as Consommation,
  3. case ACTION when 'Réintroduction' then SUM(QTY) end as Reintroduction
  4. From *mes tables*
  5. Where *mes conditions*
  6. Group by LOT, ACTION


 
Sauf que ça m'affiche une ligne par action possible dans le tableau:

Code :
  1. LOT    | Consommation | Reintroduction
  2. Lot A  | 300                 |
  3. Lot A  |                       | 80
  4. Lot B  | 220                 |
  5. Lot B  |                       | 20
  6. Lot C  | 200                 |
  7. Etc...


 
Au lieu de tout mettre sur la même ligne. Des idées sur comment faire en sorte que tout aille sur la même ligne?
 
Merci d'avance  :jap:  
 
PS: Dans les données réelles, il y à 8 cas de figures (colonnes) et dans les 400 000 lignes au départ :o

Reply

Marsh Posté le 30-07-2023 à 19:25:25   

Reply

Marsh Posté le 31-07-2023 à 08:39:21    

Ben il fait exactement ce que tu lui demandes : il te génère deux colonnes "Consommation" et "Reintroduction" et vient y mettre NULL ou bien la quantité selon le type de l'Action.

 

Je comprends pas trop pourquoi tu compliques en fait, tu n'as pas donné ton modèles mais j'ai l'impression que :

 


Select
LOT,
ACTION,
SUM(QTY) as Qty
From *mes tables*
Where *mes conditions*
Group by LOT, ACTION

 

Sans fioritures aurait directement donné ce que tu veux.
Si c'est pas ça donne un exemple complet qu'on puisse comprendre :o (schéma initial, échantillon de données, exemple de résultat voulu)


Message édité par TotalRecall le 31-07-2023 à 08:40:03

---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 31-07-2023 à 11:00:30    

Par mettre sur la même ligne, je voulais dire:
 

Code :
  1. LOT    | Consommation | Reintroduction
  2. Lot A  | 300                 | 80
  3. Lot B  | 220                 | 20
  4. Etc...


 
Au final j'ai trouvé ma réponse:
 

Code :
  1. Select LOT,
  2. SUM(case ACTION when 'Consommation' then QTY end) as Consommation,
  3. SUM(case ACTION when 'Réintroduction' then QTY end) as Reintroduction
  4. From *mes tables*
  5. Where *mes conditions*
  6. Group by LOT


 
Il faudra vraiment que j'arrive a ce qu'ils me fassent une formation SQL un de ces jours, j'ignorais totalement que l'on pouvait mettre le sum(...) a l'exterieur du case...

Reply

Marsh Posté le 31-07-2023 à 17:59:20    

Ah oui, effectivement c'était pas clair pour moi.
 
Comme je disais (sans aucune méchanceté) à l'avenir n'hésite pas à être plus précis, en donnant un exemple concret de jeu de données à traiter, et de résultat attendu.  
Et pour parfaire tu peux même donner le schéma (CREATE) et les Inserts pour tout ça si le truc est un tout petit peu compliqué (là c'était pas nécessaire cela dit), comme ça on peut recréer les données et te faire un truc qui marche.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 31-07-2023 à 20:29:51    

TotalRecall a écrit :

Ah oui, effectivement c'était pas clair pour moi.
 
Comme je disais (sans aucune méchanceté) à l'avenir n'hésite pas à être plus précis, en donnant un exemple concret de jeu de données à traiter, et de résultat attendu.  
Et pour parfaire tu peux même donner le schéma (CREATE) et les Inserts pour tout ça si le truc est un tout petit peu compliqué (là c'était pas nécessaire cela dit), comme ça on peut recréer les données et te faire un truc qui marche.


 
Désolé, pas évident car la politique d'entreprise est a la parano la plus complète. Sortir ne serais-ce qu'un bout de schéma de la BDD est perçu comme une mise en dangers... Un collègue à littéralement blêmi quand j'ai dit que j'avais demandé de l'aide en ligne pour une extraction. Même sur site, il est interdit de positionner les salles serveur sur des plans ou de dire a des gens hors de l'IT où elles se situent...
 
Compliqué de réussir a anonymiser suffisamment pour que ça soit impossible de reconnaitre quoi que ce soit tout en gardant assez de détails pour que ça soit représentatif :/

Reply

Marsh Posté le 01-08-2023 à 08:53:37    

C'est très con comme raisonnement même si je comprends le besoin de secret dans certains secteurs.  
Y a rien qui empêche de sortir des colonnes A, B, C avec des données Cas 1, Cas 2, et des nombre 100, 200, 300, et Monsieur Titi, Madame Tutu.  
Ca prend pas très longtemps de faire une ou deux tables avec ça et générer les inserts.
Il doit être vachement imaginatif le mec qui arrive à violer des secrets industriels avec ça.
 
Après il y a des gens qui sont juste paranoïaques ou qui sont tellement excités de bosser pour un truc un peu sensible qu'ils en font des tas en mode je me la joue agent secret.


---------------
Réalisation amplis classe D / T      Topic .Net - C# @ Prog
Reply

Marsh Posté le 01-08-2023 à 09:22:15    

Ca donne envie d'y bosser dans cette boîte... :o


---------------
Si vous ouvrez un sujet merci de ne pas le "laisser mourir" subitement et de le marquer comme "résolu" le cas échéant!
Reply

Marsh Posté le 02-08-2023 à 22:36:40    

Suffit de transposer ton pb réel en un pb équivalent passe-partout pour ne pas avoir de souci de confidentialité. Perso, c'est ce que je fais depuis des années quand je viens chercher de l'aide ici. Ca n'a jamais posé de problème et au final, ça m'a fait gagner du temps, l'aide que j'ai reçue.
 
Du reste, ça m'est même déjà arrivé que juste après avoir rédigé le topic et en ayant cherché un pb équivalent, je trouve moi-même la solution. Enoncer correctement un pb, c'est souvent être sur la bonne voie pour le résoudre. ;)


---------------
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-08-2023 à 22:31:56    

rufo a écrit :

Suffit de transposer ton pb réel en un pb équivalent passe-partout pour ne pas avoir de souci de confidentialité. Perso, c'est ce que je fais depuis des années quand je viens chercher de l'aide ici. Ca n'a jamais posé de problème et au final, ça m'a fait gagner du temps, l'aide que j'ai reçue.
 
Du reste, ça m'est même déjà arrivé que juste après avoir rédigé le topic et en ayant cherché un pb équivalent, je trouve moi-même la solution. Enoncer correctement un pb, c'est souvent être sur la bonne voie pour le résoudre. ;)


 
Yep, ça m'est déjà arrivé plusieurs fois de trouver la solution en venant l'écrire ici  :whistle:  
 
Mais je rajouterais plus d'infos a l'avenir. Peut être pas autant que dans les vrais requêtes (quand y à 9 tables dans le From avec les 2/3 qui ne servent qu'a relier des tables éloignées les unes des autres par exemple :o ), mais plus que là :)

Reply

Marsh Posté le 07-11-2023 à 14:25:34    

Si je comprend bien la demande, perso, j'utilise cette fonction:
https://docs.oracle.com/cd/E11882_0 [...] SQLRF30030


---------------
Arrière les Esquimaux! Je rentre seul. Un matador rentre toujours seul! Plus il est grand, plus il est seul. Je vous laisse à vos banquises, à vos igloos, à vos pingouins. ¡ Por favor Señora! À quelle heure le train pour Madrid?
Reply

Sujets relatifs:

Leave a Replay

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