IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

Regrouper plusieurs lignes dans une seule


Sujet :

Langage SQL

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 27
    Points
    27
    Par défaut Regrouper plusieurs lignes dans une seule
    Bonjour
    j'aimerais créer une requête qui permette de regrouper plusieurs lignes dans une seule.
    Prenons un exemple :
    Supposons que ma table soit comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Nom	Numero BC	Date BC	         Piece  	Client 	Qte commande
    Yves	BC1200050	27/09/2012 00:00 FA1200010	Client1	1.000000
    Yves	BC1200050	27/09/2012 00:00 FA1200010	Client1	5.000000
    Yves	BC1200050	27/09/2012 00:00 FA1200010	Client1	1.000000
    Yves	BC1200050	27/09/2012 00:00 BL1200035	Client1	3.000000
    Yves		        27/09/2012 00:00 BC1200050	Client1	6.000000
    Yves		        27/09/2012 00:00 BC1200050	Client1	1.000000
    Fred	BC1200060	27/09/2012 00:00 FA1200015	Client2	3.000000
    Fred	BC1200060	27/09/2012 00:00 FA1200015	Client2	2.000000
    Fred	BC1200060	27/09/2012 00:00 FA1200015	Client2	1.000000
    Fred		        27/09/2012 00:00 BC1200060	Client2	2.000000
    Fred		        27/09/2012 00:00 BC1200060	Client2	1.000000
    J'aimerais regrouper les lignes comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Nom	Numero BC	Date BC	         Client        Facturer*	Realiser*	A realiser*
    Yves	BC1200050	27/09/2012 00:00 Client1      7.000000	3.000000	7.000000
    Fred	BC1200060	27/09/2012 00:00 Client2      6.000000	0.000000	3.000000
    * pour les colonnes facturer( SUM des QTE pour les pièces qui commencent par FA) réaliser ( SUM des QTE pour les pièces qui commencent par BL) eta realiser ( SUM des QTE pour les pieces qui commencent par BC)

    Sachant qu'on doit regrouper par numéro de BC (pour les cas où ils sont vides, il faut voir la pièce)

    Si quelqu'un peut m'aider à résoudre ce problème qui me bloque ça serait sympa de sa part.

    Merci d'avance.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Vous devez faire un GROUP BY
    Mais d'où sortent les colonnes "Facturer", "realiser" et "A realiser" de votre résultat ?

  3. #3
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Je pense qu'il s'agit des sommes selon que le préfixe du n° de pièce est FA, BL ou BC. C'est pas joli-joli !


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     
    WITH Facture_Realise AS
    (
    SELECT SUM (CASE WHEN Piece LIKE 'FA%' THEN quantite ELSE 0 END) AS Facture
              ,SUM (CASE WHEN Piece LIKE 'BL%' THEN quantite ELSE 0 END) AS Realise
             ,Numero_BC
      FROM table
    GROUP BY Numero_BC
    ), A_Realiser AS
    (
    SELECT SUM (quantite) AS a_realiser
               ,MAX(Nom) AS Nom
               ,MAX(Date_BC) AS Date_BC
               ,piece
      FROM table
    WHERE numero_bc IS NULL
    GROUP BY piece
    )
    SELECT *
       FROM A_Realiser a
                LEFT JOIN Facture_Realise fr ON fr.Numero_BC = a.piece

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 27
    Points
    27
    Par défaut Merci
    Merci beaucoup Rei Ichido. j'ai réussi a avoir ce que je voulais.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 27
    Points
    27
    Par défaut Amélioration Requete
    Bonjour
    j'aimerais améliorer ma requête citer ci dessous :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    WITH Facture_Realise AS
    (
    SELECT SUM (CASE WHEN Piece LIKE 'FA%' THEN quantite ELSE 0 END) AS Facture
              ,SUM (CASE WHEN Piece LIKE 'BL%' THEN quantite ELSE 0 END) AS Realise
             ,Numero_BC
      FROM TABLE
    GROUP BY Numero_BC
    ), A_Realiser AS
    (
    SELECT SUM (quantite) AS a_realiser
               ,MAX(Nom) AS Nom
               ,MAX(Date_BC) AS Date_BC
               ,piece
      FROM TABLE
    WHERE numero_bc IS NULL
    GROUP BY piece
    )
    SELECT *
       FROM A_Realiser a
                LEFT JOIN Facture_Realise fr ON fr.Numero_BC = a.piece
    sachant que maintenant ma table a une colonne en plus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Nom	Produit	Numero BC	Date BC	                 Piece	        Client Qte commande
    Yves	Ges	BC1200050	27/09/2012 00:00	FA1200010	Client1	1.000000
    Yves	Ges	BC1200050	27/09/2012 00:00	FA1200010	Client1	5.000000
    Yves	Ges		        27/09/2012 00:00	BC1200050	Client1	1.000000
    Yves	Paie	BC1200050	27/09/2012 00:00	FA1200010	Client1	1.000000
    Yves	Paie	BC1200050	27/09/2012 00:00	BL1200035	Client1	3.000000
    Yves	Paie		        27/09/2012 00:00	BC1200050	Client1	6.000000
    Fred	ECF	BC1200060	27/09/2012 00:00	FA1200015	Client2	3.000000
    Fred	ECF	BC1200060	27/09/2012 00:00	FA1200015	Client2	2.000000
    Fred	ECF		        27/09/2012 00:00	BC1200060	Client2	1.000000
    Fred	Ges	BC1200060	27/09/2012 00:00	FA1200015	Client2	1.000000
    Fred	Ges		        27/09/2012 00:00	BC1200060	Client2	2.000000
    et j'aimerai regrouper ca comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Nom	Produit	Numero BC	Date BC	                Client	Facturer*	Realiser*	A realiser*
    Yves	Ges	BC1200050	27/09/2012 00:00	Client1	6.000000	0.000000	1.000000
    Yves	Paie	BC1200050	28/09/2012 00:00	Client1	1.000000	3.000000	6.000000
    Fred	ECF	BC1200060	27/09/2012 00:00	Client2	5.000000	0.000000	1.000000
    Fred	Ges	BC1200060	27/09/2012 00:00	Client2	1.000000	0.000000	2.000000
    Merci

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2008
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 42
    Points : 27
    Points
    27
    Par défaut Progression
    Re bonjour,

    Apres quelque recherche je suis arriver a ça :
    j'ai diviser la requête en deux :
    1ere requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    select 
    produit,
    dl_piecebc,
    ct_intitule,
    MAX(CO_Prenom) AS Nom,
    MAX(Consultant) as consultant1,
    MAX(DL_DateBC) AS Date_BC,
    SUM (CASE WHEN do_Piece LIKE 'FA%' THEN dl_qte ELSE 0 END) AS Facture,
    SUM (CASE WHEN do_Piece LIKE 'BL%' THEN dl_qte ELSE 0 END) AS Realise
    from cde_encours
    where ct_intitule = 'X'
    and dl_piecebc <> ''
    group by produit,dl_piecebc,ct_intitule
    order by produit
    qui donne comme resultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Produit		   	Ncommande	Client	Commercial	Consultant	Date commande		Facture		Realise
    Comptabilité 	   	BC01		X	Y		Z		30/11/2010 00:00	11.000000	0.000000
    Immobilisations    	BC01		X	Y		Z		30/11/2010 00:00	4.000000	0.000000
    Moyens de paiement      BC01		X	Y		Z		30/11/2010 00:00	3.000000	0.000000
    Suite Comptable & Fin	BC01		X	Y		Z		30/11/2010 00:00	3.000000	0.000000
    Telbac			BC01		X	Y		Z		30/11/2010 00:00	1.000000	0.000000
    Trésorerie		BC01		X	Y		Z		30/11/2010 00:00	1.000000	0.000000
    et la 2eme requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
    	    max(produit) as produit2,
                do_piece,
    	    MAX(ct_intitule) as Client
               ,MAX(CO_Prenom) AS Nom2
               ,MAX(Consultant) as consultant2
               ,MAX(DL_DateBC) AS Date_BC2
    		   ,SUM (dl_qte) AS a_realiser
      FROM cde_encours
    WHERE DL_PieceBC = ''
    and  ct_intitule = 'X'
    GROUP BY do_piece
    qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Produit			Ncommande	Client	Commercial	Consultant	Date commande		A realise
    Trésorerie		BC01		X	Y		Z		30/11/2010 00:00	2.000000
    Trésorerie		BC02		X	Y		Z		31/10/2011 00:00	3.000000
    Suite Comptable & Fin	BC03		X	Y		Z		12/06/2012 00:00	1.000000
    et quand je regroupe les deux requetes comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    WITH Facture_Realise AS
    (
    select 
    produit,
    dl_piecebc,
    ct_intitule,
    SUM (CASE WHEN do_Piece LIKE 'FA%' THEN dl_qte ELSE 0 END) AS Facture,
    SUM (CASE WHEN do_Piece LIKE 'BL%' THEN dl_qte ELSE 0 END) AS Realise,
    MAX(CO_Prenom) AS Nom,
    MAX(Consultant) as consultant1,
    MAX(DL_DateBC) AS Date_BC
    from cde_encours
    where dl_piecebc <> ''
    group by produit,dl_piecebc,ct_intitule
    ), A_Realiser AS
    (
    SELECT MAX(ct_intitule) as Client
               ,MAX(CO_Prenom) AS Nom2
               ,MAX(Consultant) as consultant2
               ,MAX(DL_DateBC) AS Date_BC2
               ,do_piece
    		   ,SUM (dl_qte) AS a_realiser
    		   ,max(produit) as produit2
      FROM cde_encours
    WHERE DL_PieceBC = ''
    GROUP BY do_piece,ct_intitule,dl_piecebc
    )
    SELECT Client,Nom2 as Commercial,CASE WHEN consultant2 = '' THEN consultant1 ELSE consultant2 END as Consultant,Date_BC2 as [Date commande],do_piece as [N° commande],produit as Produit,CASE WHEN Facture IS NULL THEN 0 ELSE Facture END as Facturé,CASE WHEN Realise IS NULL THEN 0 ELSE Realise END as Realisé,a_realiser as [A réaliser],(CASE WHEN Facture IS NULL THEN 0 ELSE Facture END + CASE WHEN Realise IS NULL THEN 0 ELSE Realise END + a_realiser) as [Total commander]
       FROM Facture_Realise fr 
                RIght  JOIN A_Realiser a ON (fr.DL_PieceBC = a.do_piece) 
                where client = 'X'
                order by client
    le resultat est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Produit			Ncommande	Client	Commercial	Consultant	Date commande		Facture		Realise		A realise	Total
    Comptabilité 		BC01		X	Y		Z		30/11/2010 00:00	11.000000	0.000000	2.000000	13.000000
    Immobilisations 	BC01		X	Y		Z		30/11/2010 00:00	4.000000	0.000000	2.000000	6.000000
    Moyens de paiement 	BC01		X	Y		Z		30/11/2010 00:00	3.000000	0.000000	2.000000	5.000000
    Suite Comptable & Fin	BC01		X	Y		Z		30/11/2010 00:00	3.000000	0.000000	2.000000	5.000000
    Telbac			BC01		X	Y		Z		30/11/2010 00:00	1.000000	0.000000	2.000000	3.000000
    Trésorerie		BC01		X	Y		Z		30/11/2010 00:00	1.000000	0.000000	2.000000	3.000000
    NULL			BC02		X	Y		z		31/10/2011 00:00	0.000000	0.000000	3.000000	3.000000
    NULL			BC03		X	Y		z		12/06/2012 00:00	0.000000	0.000000	1.000000	1.000000
    Alors que le resultat doit etre comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Produit			Ncommande	Client	Commercial	Consultant	Date commande		Facture		Realise		A realise	Total
    Comptabilité 		BC01		X	Y		Z		30/11/2010 00:00	11.000000	0.000000	0.000000	11.000000
    Immobilisations 	BC01		X	Y		Z		30/11/2010 00:00	4.000000	0.000000	0.000000	4.000000
    Moyens de paiement 	BC01		X	Y		Z		30/11/2010 00:00	3.000000	0.000000	0.000000	3.000000
    Suite Comptable & Fin	BC01		X	Y		Z		30/11/2010 00:00	3.000000	0.000000	0.000000	3.000000
    Telbac			BC01		X	Y		Z		30/11/2010 00:00	1.000000	0.000000	0.000000	1.000000
    Trésorerie		BC01		X	Y		Z		30/11/2010 00:00	1.000000	0.000000	2.000000	3.000000
    Trésorerie		BC02		X	Y		z		31/10/2011 00:00	0.000000	0.000000	3.000000	3.000000
    Suite Comptable & Fin	BC03		X	Y		z		12/06/2012 00:00	0.000000	0.000000	1.000000	1.000000

Discussions similaires

  1. [AC-2007] Regrouper plusieurs cellules dans une seule
    Par J_help dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 20/07/2009, 18h47
  2. SQL : Regrouper des lignes dans une seule colonne
    Par manoir62 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/02/2009, 18h06
  3. Mettre le contenu de plusieurs lignes dans une seule case
    Par bellamouna dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 09/12/2008, 12h11
  4. Réponses: 4
    Dernier message: 26/12/2007, 22h59
  5. Plusieurs lignes dans une seule
    Par rlnd23 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 07/02/2007, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo