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

MS SQL Server Discussion :

2 Boucles WHILE imbriquées pour obtenir des lignes de sous-totaux sur 2 colonnes


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 15
    Par défaut 2 Boucles WHILE imbriquées pour obtenir des lignes de sous-totaux sur 2 colonnes
    Bonjour,

    Je suis coincé !!! et débutant...

    Mon objectif est donc d'insérer des lignes de sous-totaux dans deux colonnes. Jusqu'à présent, j'ai pu depuis une table temporaire PIVOT et avec une boucle WHILE basique obtenir des ligne de sous-totaux pour une colonne mais impossible d'y insérer un autre WHILE pour créer des sous-totaux imbriqués pour une deuxième colonne.

    Merci pour votre aide, il doit sans doute y avoir d'autres solutions.

    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
    while (select IdCE from CE where IdCE = @I) = @I
    begin
    		set @NomCE = (select NomCE from CE where IdCE = @I)
     
    		insert into #whileCE
    			SELECT CE,R1,R2,E,C,T -- je dois obtenir des lignes sous-total sur R1
    			  FROM #pivot PT
    			  join CE C
    			  on C.NomCE = PT.CE
    			  where C.IdCE = @I
    		union all
    			select 'Total'+' '+@NomCE,'','',sum(E),sum(C),sum(T)
    			  FROM #pivot PT
    			  join CE C
    			  on C.NomCE = PT.CE
    			  where C.IdCE = @I
    		set @I= @I+1
    end

  2. #2
    Membre très actif Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 333
    Par défaut
    Bonjour,
    Règles de postage à lire impérativement avant de poster
    tu y trouveras comment générer les requêtes DDL.
    Sois plus précis sur ce que tu veux faire.
    cordialement,

  3. #3
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 15
    Par défaut
    Je souhaite obtenir cette ligne sous total supplémentaire.
    Merci

    CE Rang 1 Rang 2 Encadrants Compagnons TOTAL
    CC GOYER 2 3 5
    Total CC 2 3 5
    GO INFRA BOTTE FONDATIONS SOLETANCHE 1 2 3
    GO INFRA BOTTE FONDATIONS SOLETANCHE ECR ENVIRONNEMENT IDF 0 1 1
    TOTAL BOTTE FONDATIONS SOLETANCHE 1 3 4
    ...
    Total GO INFRA 1 8 9

    Quant à l'amélioration de la lisibilité du bout de requête, je ne sais pas comment faire.

  4. #4
    Membre très actif Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    333
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant Senior dba sql server & Microsoft Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2008
    Messages : 333
    Par défaut
    Les requêtes DDL c'est ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE [dbo].[CATEGORIE](
    	[IDCATEGORIE] [numeric](18, 0) IDENTITY(1,1) NOT NULL,
    	[NOMCATEGORIE] [nvarchar](63) NULL,
    	[DESCRIPTION] [nvarchar](max) NULL,
     CONSTRAINT [PK_CATEGORIE] PRIMARY KEY CLUSTERED 
    (
    	[IDCATEGORIE] ASC
    ))
    ca nous permet de pouvoir tester chez nous les requêtes
    Cordialement,

  5. #5
    Membre habitué
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2016
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Septembre 2016
    Messages : 15
    Par défaut
    J'ai fais au mieux.

    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    USE [VISOR]
    GO
    SET LANGUAGE FRENCH
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
     
    DECLARE
    @I INT = 1,
    @J INT = 1,
    @NOMCE NVARCHAR(MAX) = '',
    @NOMRANG1 NVARCHAR(MAX) = ''
     
    IF OBJECT_ID ('TEMPDB..#PIVOT') IS NOT NULL
    DROP TABLE #PIVOT
     
    CREATE TABLE #PIVOT -- TABLE TEMPORAIRE POUR LE PIVOT
    (
    	CE NVARCHAR(MAX),
    	R1 NVARCHAR(MAX),
    	R2 NVARCHAR(MAX),
    	E INT,
    	C INT,
    	T INT
    );
     
    IF OBJECT_ID ('TEMPDB..#WHILECE') IS NOT NULL
    DROP TABLE #WHILECE
     
    CREATE TABLE #WHILECE -- TABLE TEMPORAIRE POUR LA BOUCLE WHILE DEPUIS TABLE PIVOT ET AJOUT LIGNE TOTAL GÉNÉRAL
    (
    	CE NVARCHAR(MAX),
    	[RANG 1] NVARCHAR(MAX),
    	[RANG 2] NVARCHAR(MAX),
    	ENCADRANTS INT,
    	COMPAGNONS INT,
    	TOTAL INT
    );
     
     
    WITH REQUETE AS -- VUE DE LA REQUETE DE BASE
    (
    SELECT DISTINCT
    		E.CHAMP4 AS [CE],
    		ISNULL(S.GERANT, S.LIBELLE) AS [RANG 1], -- PERMUTE ENTREPRISE ET ST POUR RANG 1
    			CASE
    			WHEN (S.GERANT IS NULL)
    			THEN ''
    			WHEN (S.GERANT IS NOT NULL)
    			THEN S.LIBELLE
    			END AS [RANG 2], -- PERMUTE ENTREPRISE ET ST POUR RANG 2
     
    		E.CHAMP2 AS FONCTION,
    		COUNT(DISTINCT E.IDUTILISATEUR) AS TL -- COLONNE TOTAL
    	FROM
    		EVENEMENTS E
    		FULL JOIN
    		SOCIETES S ON E.IDSOCIETE = S.IDSOCIETE
    		FULL JOIN
    		LECTEURS L ON E.IDLECTEUR = L.IDLECTEUR
    		FULL JOIN
    		UTILISATEURS U ON E.IDUTILISATEUR = U.IDBASE
    	WHERE
    		--E.DATEEVENEMENT > CAST(CONVERT(VARCHAR,DATEADD(DD,0,'08/09/2016'),103) + ' ' + '11:30' AS SMALLDATETIME) AND E.DATEEVENEMENT <  CAST(CONVERT(VARCHAR,'08/09/2016',103) + ' ' + '12:00' AS SMALLDATETIME)
    		--AND
    		(L.APB =1)
    		AND  U.PRESENCE = 1 -- SELECTION TOURNIQUETS EN ENTRÉE VIA ANTI PASSBACK ET PRESENCE
    		AND S.IDSOCIETE <> 150
    	GROUP BY E.CHAMP4,S.LIBELLE,S.GERANT,E.CHAMP2
    )
     
    INSERT INTO #PIVOT 
     
    SELECT COALESCE(CE,''), COALESCE([RANG 1],''), COALESCE([RANG 2],''), COALESCE([ENCADRANT],''), COALESCE([COMPAGNON],''), SUM(COALESCE([ENCADRANT],'')+COALESCE([COMPAGNON],''))
    	FROM REQUETE
    		PIVOT
    		(SUM(TL) FOR FONCTION IN ([ENCADRANT],[COMPAGNON])) AS P	-- RESULTAT DU PIVOT
    	GROUP BY CE,[RANG 1],[RANG 2],ENCADRANT,COMPAGNON
     
    --SELECT * FROM #PIVOT
     
    WHILE (SELECT IDCE FROM CE WHERE IDCE = @I) = @I
    BEGIN
    	SET @NOMCE = (SELECT NOMCE FROM CE WHERE IDCE = @I)
     
    	INSERT INTO #WHILECE
    		SELECT CE,R1,R2,E,C,T
    			FROM #PIVOT PT
    				JOIN CE C
    				ON C.NOMCE = PT.CE
    			WHERE C.IDCE = @I
    		UNION ALL
    		SELECT 'TOTAL'+' '+@NOMCE,'','',SUM(E),SUM(C),SUM(T)
    			FROM #PIVOT PT
    				JOIN CE C
    				ON C.NOMCE = PT.CE
    			WHERE C.IDCE = @I
    	SET @I= @I+1
    END
     
    SELECT * FROM #WHILECE
    UNION ALL
    SELECT 'TOTAL GENERAL','','',SUM(ENCADRANTS)/2,SUM(COMPAGNONS)/2,SUM(TOTAL)/2
    	FROM #WHILECE

  6. #6
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Connais-tu ROLLUP ? Si tu souhaites avoir des totaux, sous-totaux, etc... c'est sans doute ce qu'il te faut.

    De même, il serait bon que l'on ait les données de bases, sur lesquelles tu t'appuies pour réaliser tous tes calculs, car j'ai l'impression que ta solution à coup de WHILE est très complexe et contre-performante. Tu ne nous as fournis que les tables temporaires sur lesquels tu t'appuies.

    Le mieux, pour obtenir de l'aide, c'est :
    1. Préciser le schéma de ta base ;
    2. Avoir des données ;
    3. Montrer le résultat souhaité ;
    4. Nous fournir des scripts pour générer schéma + données (merci Bernardos);
    5. Nous faire part des difficultés rencontrées, éventuellement en postant la ou les ébauche(s) de solution sur lesquelles tu travailles.

  7. #7
    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
    Par défaut
    Bonjour,

    Il me semble qu'un ROLLUP devrait suffire si j'ai bien compris votre besoin :

    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
    33
    34
    35
    36
    37
     
    WITH REQUETE AS -- VUE DE LA REQUETE DE BASE
    (
    SELECT DISTINCT
    		E.CHAMP4 AS [CE],
    		ISNULL(S.GERANT, S.LIBELLE) AS [RANG 1], -- PERMUTE ENTREPRISE ET ST POUR RANG 1
    			CASE
    			WHEN (S.GERANT IS NULL)
    			THEN ''
    			WHEN (S.GERANT IS NOT NULL)
    			THEN S.LIBELLE
    			END AS [RANG 2], -- PERMUTE ENTREPRISE ET ST POUR RANG 2
     
    		E.CHAMP2 AS FONCTION,
    		COUNT(DISTINCT E.IDUTILISATEUR) AS TL -- COLONNE TOTAL
    	FROM
    		EVENEMENTS E
    		FULL JOIN
    		SOCIETES S ON E.IDSOCIETE = S.IDSOCIETE
    		FULL JOIN
    		LECTEURS L ON E.IDLECTEUR = L.IDLECTEUR
    		FULL JOIN
    		UTILISATEURS U ON E.IDUTILISATEUR = U.IDBASE
    	WHERE
    		--E.DATEEVENEMENT > CAST(CONVERT(VARCHAR,DATEADD(DD,0,'08/09/2016'),103) + ' ' + '11:30' AS SMALLDATETIME) AND E.DATEEVENEMENT <  CAST(CONVERT(VARCHAR,'08/09/2016',103) + ' ' + '12:00' AS SMALLDATETIME)
    		--AND
    		(L.APB =1)
    		AND  U.PRESENCE = 1 -- SELECTION TOURNIQUETS EN ENTRÉE VIA ANTI PASSBACK ET PRESENCE
    		AND S.IDSOCIETE <> 150
    	GROUP BY E.CHAMP4,S.LIBELLE,S.GERANT,E.CHAMP2
    ) 
    SELECT COALESCE(CE,''), COALESCE([RANG 1],''), COALESCE([RANG 2],''), COALESCE([ENCADRANT],''), COALESCE([COMPAGNON],''), SUM(COALESCE([ENCADRANT],'')+COALESCE([COMPAGNON],''))
    	FROM REQUETE
    		PIVOT
    		(SUM(TL) FOR FONCTION IN ([ENCADRANT],[COMPAGNON])) AS P	-- RESULTAT DU PIVOT
    	GROUP BY CE,[RANG 1],[RANG 2],ENCADRANT,COMPAGNON
    WITH ROLLUP
    Il restera éventuellement à remplacer les NULL générés par la valeur de votre choix.

Discussions similaires

  1. [XL-2007] Boucle très lente pour supprimer des lignes
    Par Mycomer dans le forum Macros et VBA Excel
    Réponses: 25
    Dernier message: 21/01/2016, 16h34
  2. Réponses: 2
    Dernier message: 09/10/2015, 08h20
  3. Une boucle pour supprimer des lignes ?
    Par eldoir dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/04/2012, 18h43
  4. sed et boucle pour pour supprimer des lignes
    Par edouardj dans le forum Linux
    Réponses: 15
    Dernier message: 09/11/2007, 12h39
  5. [EXCEL 2003] Coloriser des lignes de sous-totaux
    Par FINGIB dans le forum Excel
    Réponses: 4
    Dernier message: 09/11/2007, 09h05

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