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

  1. #1
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    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 éclairé Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 332
    Points : 723
    Points
    723
    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,
    Loïc BERNARD
    Consultant Senior dba sql server & Microsoft Business Intelligence



    Il n'y a jamais de problèmes, il n'y a que des solutions!

  3. #3
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    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 éclairé Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 332
    Points : 723
    Points
    723
    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,
    Loïc BERNARD
    Consultant Senior dba sql server & Microsoft Business Intelligence



    Il n'y a jamais de problèmes, il n'y a que des solutions!

  5. #5
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    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 éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    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.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  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
    Points : 13 092
    Points
    13 092
    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.

  8. #8
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    Merci mais le ROLLUP ne donnait pas les résultats attendus, c'est pourquoi je suis passé par une (des) boucle(s) WHILE.

  9. #9
    Membre éclairé Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 332
    Points : 723
    Points
    723
    Par défaut
    si tu nous donnes le script de création de tes tables de bases (pas les table temporaire) avec un jeu de données (insert) et que tu nous expliques le résultat attendu (mais ca je pense que j'ai compris),
    on va pouvoir te proposer de belles requêtes qui n'utiliseront pas ces affreuses tables temporaires
    Cordialement,
    Loïc BERNARD
    Consultant Senior dba sql server & Microsoft Business Intelligence



    Il n'y a jamais de problèmes, il n'y a que des solutions!

  10. #10
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    Pour le jeu de données INSERT, je ne sais pas comment vous le fournir !..

  11. #11
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Pour générer un script avec schéma et données, tu peux, depuis SQL Server Management Studio :
    • te connecter à ton instance ;
    • faire un clic droit sur ta base de données et sélectionner "Tâches > Générer des scripts" ;
    • tu pourras alors choisir les éléments à exporter. Tout, ou juste une partie. Pour nous, juste les tables nécessaires "societe" et "evenement" par exemple.
    • Après avoir choisi les tables, tu cliques sur suivant
    • Sur cette nouvelle page, il y a un bouton "Avancé". Clique dessus
    • Dans la fenêtre qui s'ouvre, au niveau de "Type de données à inclure dans le script", spécifie bien "schéma et données".
    • tu cliques sur ok pour fermer la petite fenêtre
    • tu cliques sur suivant pour afficher le résumé des opérations
    • tu cliques sur suivant pour réaliser l'exportation


    A noter que cette méthode fonctionne très bien pour de petits jeux de données. Si tu as beaucoup de données, il te faut extraire un jeu de données utiles avant de nous le communiquer (on n'a pas besoin d'avoir 150000 enregistrements dans chaque table pour aider à répondre à une question )
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  12. #12
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    C'est bon j'ai procédé à l'extraction !
    Cependant, comment je vous le poste ??

  13. #13
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    C'est bon, voici le script attendu. Petit souci avec Firefox qui ne m'ouvrait pas la fenêtre pièce-jointe

    script.zip

  14. #14
    Membre éclairé Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 332
    Points : 723
    Points
    723
    Par défaut
    en principe c'est un script avec des insert que tu as obtenu, non?
    Loïc BERNARD
    Consultant Senior dba sql server & Microsoft Business Intelligence



    Il n'y a jamais de problèmes, il n'y a que des solutions!

  15. #15
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Bernardos Voir le message
    en principe c'est un script avec des insert que tu as obtenu, non?
    J'ai appliqué les recommandations de dorinf.

    Il y a les CREATE et INSERT.

    J'ai joint le résultat de mon travail (code déjà posté) sous forme de procédure stockée également.

  16. #16
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Merci, j'ai pu créer une base de test !

    Voici un script
    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 REQUETE AS (
    SELECT DISTINCT	E.Champ4 AS CE, 
    		S.Libelle, 
    		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,
    		E.IdUtilisateur
    	FROM Evenements AS E
    	INNER JOIN Societes AS S ON E.IdSociete = S.IdSociete)
    SELECT	R.CE, 
    		R.[RANG 1],
    		R.[RANG 2],
    		SUM(CASE WHEN R.Fonction = 'Encadrant' THEN 1 ELSE 0 END) AS Encadrant, 
    		SUM(CASE WHEN R.Fonction = 'Compagnon' THEN 1 ELSE 0 END) AS Compagnon
    	FROM REQUETE AS R
    	GROUP BY R.CE, R.[RANG 1], R.[RANG 2] WITH ROLLUP
    J'obtiens a priori ce que tu attends, sauf que 3 compagnons pour RANG1='BOTTE FONDATIONS SOLETANCHE' et RANG2=''.

    Pas de while, juste un ROLLUP ! Ou alors je n'ai pas compris ce que tu attendais...

    Extrait des résultats :
    GO INFRA	BOTTE FONDATIONS SOLETANCHE		                1	3
    GO INFRA	BOTTE FONDATIONS SOLETANCHE	ECR ENVIRONNEMENT IDF	0	1
    GO INFRA	BOTTE FONDATIONS SOLETANCHE	NULL	                1	4
    
    Il manque le total (encadrant + compagnon), mais je te laisse le calcul

    [EDIT]
    La différence dans le calcul vient certainement du fait que de mon côté, j'ai supprimé la clause WHERE lorsque j'ai défini la CTE Requete. N'ayant pas toutes les tables, je ne pouvais pas garder les contraintes.
    [/EDIT]
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  17. #17
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    Merci beaucoup !
    Je vais regarder tout cela de très près.

  18. #18
    Nouveau Candidat au Club
    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
    Points : 1
    Points
    1
    Par défaut
    Comment supprimer les lignes inutiles ?

    Nom : Capture.PNG
Affichages : 598
Taille : 5,3 Ko

  19. #19
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    En modifiant la requête ainsi
    Code SQL : 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
    WITH REQUETE AS (
    SELECT DISTINCT	E.Champ4 AS CE, 
    		S.Libelle, 
    		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,
    		E.IdUtilisateur
    	FROM Evenements AS E
    	INNER JOIN Societes AS S ON E.IdSociete = S.IdSociete),
    DATA AS (
    SELECT	R.CE, 
    		R.[RANG 1],
    		R.[RANG 2],
    		SUM(CASE WHEN R.Fonction = 'Encadrant' THEN 1 ELSE 0 END) AS Encadrant, 
    		SUM(CASE WHEN R.Fonction = 'Compagnon' THEN 1 ELSE 0 END) AS Compagnon
    	FROM REQUETE AS R
    	GROUP BY R.CE, R.[RANG 1], R.[RANG 2] WITH ROLLUP),
    STAT AS (	
    	SELECT D.CE,
    	D.[RANG 1],
    	D.[RANG 2],
    	D.Encadrant,
    	D.Compagnon,
    	(SELECT COUNT(*) FROM DATA AS E WHERE E.[RANG 1] IS NOT NULL AND E.[RANG 2] IS NOT NULL AND										  
    										  E.CE = D.CE AND E.[RANG 1] = D.[RANG 1]) AS 'nb_lignes'
    	FROM DATA AS D
    )
    SELECT S.CE,S.[RANG 1], S.[RANG 2], S.Encadrant, S.Compagnon FROM STAT AS S WHERE S.[RANG 2] IS NOT NULL OR (S.[RANG 2] IS NULL AND S.nb_lignes > 1)

    En gros, pour chaque ligne de sous-total (RANG2 est nul), on détermine le nombre de lignes y participant. S'il n'y en a qu'une, le sous-total est filtré.

    Maintenant, est-il judicieux de mettre cela au niveau de la requête elle-même, je n'en suis pas sûr. Ce serait plus le rôle d'un post traitement.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  20. #20
    Membre éclairé Avatar de Bernardos
    Homme Profil pro
    Consultant Senior dba sql server & Microsoft Business Intelligence
    Inscrit en
    Avril 2008
    Messages
    332
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 332
    Points : 723
    Points
    723
    Par défaut
    Bonjour,
    EDIT : j'avais mis une requête mais après analyse, elle est foireuse
    Par contre, j'ai voulu ajouter une clé étrangère sur ton idsociete de la table evenement.
    mais impossible car dans ton set de données il y a 26 enregistrements pour lesquels le idsociete est à 0 et il n'existe pas de idsociete à 0 dans ta table societe.
    Donc pour moi dans ton cas, 2 solutions:
    • si c'est temporaire (c'est à dire que tu n'as pas encore l'info mais que l'info tu la connaitras un jour) tu peux laisser ce champ à null dans la table evenement et le remplir plus tard.
    • Sinon tu crées une société "inconnue" avec l'idsociete 0 dans ta table société (note que ca pourrait être n'importe quel id). si tu as plusieurs besoin, tu peux aussi créer plusieurs société genre "inconnue", "en attente" ou "non applicable"

    en tout cas, ce qui est sur, pour des raisons de performances et de cohérence des données, il te faut mettre les contraintes sur les clés étrangères!

    Cordialement,
    Loïc BERNARD
    Consultant Senior dba sql server & Microsoft Business Intelligence



    Il n'y a jamais de problèmes, il n'y a que des solutions!

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