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

Développement SQL Server Discussion :

Création de sous totaux [2012]


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut Création de sous totaux
    Bonjour à tous,
    J'ai une requête SQl ou j'ai inséré la fonction grouping que je ne maitrise pas très bien je l'avoue.
    Le résultat est presque celui que je recherche mais il me manque un sous total que je n'arrive pas à afficher . Dans la colonne TYPE_TRI, je souhaiterais pourvoir afficher le titre "Total rejet" et dans la colonne "Nbcolis", le nombre total de colis en rejets soit :4974. Et pour compliquer le tout, je souhaite que le détail des rejets soit toujours affiché
    .
    C'est pourquoi, je viens vers vous pour une aide
    Et merci d'avance pour votre aide

    Voici une photo du résultat de la requête:
    et ci dessous, la requete SQL
    Nom : requete SQL regroupement.PNG
Affichages : 724
Taille : 22,0 Ko
    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
    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
    SELECT 
    coalesce([System].[Name],'Trieur') AS TRIEUR, 
    coalesce(CASE [ParcelEvent].[EventTypeNum] WHEN @EVENT_TYPE_REJECT THEN 'Rejet' ELSE 'Tri et contrôle' END,'TOTAL (Tri et controle + Rejet)') AS TYPE_TRI, 
    coalesce([RejectType].[Name],'') AS TYPE_DESTINATION, 
    coalesce([RejectReason].[Name],'') AS Détail, 
    COUNT(DISTINCT ParcelEvent.ParcelId) AS Nb_colis
     
    FROM [ParcelEvent] (NOLOCK)
    INNER JOIN [System] (NOLOCK)
    ON [ParcelEvent].[SystemNum]=[System].[Num] AND [ParcelEvent].[EventTypeNum] IN (@EVENT_TYPE_SORTING,@EVENT_TYPE_REJECT)
     
    LEFT OUTER JOIN [RejectReason]
    ON [ParcelEvent].[AssociatedData]=[RejectReason].[RejectReason]
     
    LEFT OUTER JOIN [RejectType]
    ON [RejectReason].[RejectType]=[RejectType].[Type]
     
     
    WHERE ([ParcelEvent].[DateTime] BETWEEN @StartDateTime  AND @EndDateTime)
     
    GROUP BY 
    [System].[Name],
    (CASE [ParcelEvent].[EventTypeNum] WHEN @EVENT_TYPE_REJECT THEN 'Rejet' ELSE 'Tri et contrôle' END),
    [RejectType].[Name] ,
    [RejectReason].[Name]
    with ROLLUP
     
     
    HAVING
     
     
    (grouping([System].[Name]) = 0
     and grouping(CASE [ParcelEvent].[EventTypeNum] WHEN @EVENT_TYPE_REJECT THEN 'Rejet' ELSE 'Tri et contrôle' END) = 0
    and grouping([RejectType].[Name]) = 0
    and grouping([RejectReason].[Name])  = 0)
     or
      (grouping([System].[Name]) = 1
     and grouping(CASE [ParcelEvent].[EventTypeNum] WHEN @EVENT_TYPE_REJECT THEN 'Rejet' ELSE 'Tri et contrôle' END) = 1
    and grouping([RejectType].[Name]) = 1
    and grouping([RejectReason].[Name])  = 1)
     
    ORDER BY 
     
    TYPE_DESTINATION,
    Nb_colis DESC

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Virez votre actuel GROUP BY et faite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GROUP BY ROLLUP(TYPE_TRI, TYPE_DESTINATION, Détail)
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour SQlpro
    avant tout merci de vous penchez sur ma problématique.
    Si je remplace mon group BY par le votre, j'ai un message d'erreur
    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
    SELECT 
    coalesce([System].[Name],'Trieur') AS TRIEUR, 
    coalesce(CASE [ParcelEvent].[EventTypeNum] WHEN @EVENT_TYPE_REJECT THEN 'Rejet' ELSE 'Tri et contrôle' END,'TOTAL (Tri et controle + Rejet)') AS TYPE_TRI, 
    coalesce([RejectType].[Name],'') AS TYPE_DESTINATION, 
    coalesce([RejectReason].[Name],'') AS Détail, 
    COUNT(DISTINCT ParcelEvent.ParcelId) AS Nb_colis
     
    FROM [ParcelEvent] (NOLOCK)
    INNER JOIN [System] (NOLOCK)
    ON [ParcelEvent].[SystemNum]=[System].[Num] AND [ParcelEvent].[EventTypeNum] IN (@EVENT_TYPE_SORTING,@EVENT_TYPE_REJECT)
     
    LEFT OUTER JOIN [RejectReason]
    ON [ParcelEvent].[AssociatedData]=[RejectReason].[RejectReason]
     
    LEFT OUTER JOIN [RejectType]
    ON [RejectReason].[RejectType]=[RejectType].[Type]
     
     
    WHERE ([ParcelEvent].[DateTime] BETWEEN @StartDateTime  AND @EndDateTime)
     
     
    GROUP BY ROLLUP(TYPE_TRI, TYPE_DESTINATION, Détail)

    Msg*207, Niveau*16, État*1, Ligne*68
    Nom de colonne non valide*: 'TYPE_TRI'.
    Msg*207, Niveau*16, État*1, Ligne*68
    Nom de colonne non valide*: 'TYPE_DESTINATION'.
    Msg*207, Niveau*16, État*1, Ligne*68
    Nom de colonne non valide*: 'Détail'.
    donc j'ai modifié votre group by en y inserant le vrai intitulé des champ et non leur alias
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Select
    .
    .
    .
    .
    GROUP BY ROLLUP
    (
    coalesce(CASE [ParcelEvent].[EventTypeNum] WHEN @EVENT_TYPE_REJECT THEN 'Rejet' ELSE 'Tri et contrôle' END,'TOTAL (Tri et controle + Rejet)'),
    coalesce([RejectType].[Name],''),
    coalesce([RejectReason].[Name],'')
    )
    et là j'ai un autre message d'erreur qui s'affiche
    Msg*8120, Niveau*16, État*1, Ligne*48
    La colonne 'System.Name' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.
    Msg*8120, Niveau*16, État*1, Ligne*48
    La colonne 'System.Name' n'est pas valide dans la liste de sélection parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.
    J'ai donc j'ai inseré dans le group by le champ System.Name
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Select
    .
    .
    .
    GROUP BY ROLLUP
    (
    coalesce([System].[Name],'Trieur'),
    coalesce(CASE [ParcelEvent].[EventTypeNum] WHEN @EVENT_TYPE_REJECT THEN 'Rejet' ELSE 'Tri et contrôle' END,'TOTAL (Tri et controle + Rejet)'),
    coalesce([RejectType].[Name],''),
    coalesce([RejectReason].[Name],'')
    )

    et là, la requête fonctionne mais me donne pas le résultat escompté .même pire ,j'ai des doublons de lignes

    Nom : requete SQL regroupement.PNG
Affichages : 635
Taille : 23,8 Ko

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 080
    Points : 30 789
    Points
    30 789
    Par défaut
    Citation Envoyé par facteur Voir le message
    j'ai des doublons de lignes
    Des doublons ? Où donc ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour Al,
    Effectivement ce n'est pas es doublons au sens strict mais ce sont des lignes supplémentaires que je ne souhaites pas voir affichier car les données y sont déjà mentionné comme par exemple : le nombre de colis 31 en rejet hors plan de tri qui est mentionnée deux fois sur le tableau.
    Je souhaite simplement rajouter au tableau ci dessous, un sous total supplémentaire qui me calcule le nombre total de rejet.
    Ci dessous, le tableau que j'ai et la ligne en rouge que je souhaite créer mais que je n'arrive pas .
    Nom : requete SQL regroupement.PNG
Affichages : 672
Taille : 17,6 Ko

  6. #6
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Le détail du fonctionnement de ROLLUP est décrit ici https://docs.microsoft.com/fr-fr/sql...ql-server-2017
    Donc le résultat obtenu est parfaitement conforme.

    Ce qui n'est pas clair c'est l'objectif de votre requête : pourquoi vouloir uniquement une ligne de total ? comment allez vous exploiter le jeu de résultat ?
    Le savoir est une nourriture qui exige des efforts.

  7. #7
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour Michel,
    Merci pour ce tuto.
    l'objectif de ma requête était d'intégrer un sous total sans le rajout de ligne supplémentaire de sous totaux.
    je pensais que c'était simple mais c'est plus compliqué que je ne le pensais
    j'ai fais différemment: j'ai fais une requête union afin de contourner ce problème.
    Merci encore de votre aide à tous.
    Je clôture cette discussion

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 01/02/2018, 17h24
  2. Création d'un TCD : calcul de sous totaux
    Par Akane94 dans le forum Excel
    Réponses: 2
    Dernier message: 19/07/2016, 13h20
  3. Création automatique de sous-totaux dans un tableau
    Par janakka-horus dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 16/09/2015, 09h50
  4. [XL-2007] Création macro calculs de sous-totaux
    Par jchen dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 13/06/2012, 16h37
  5. Création macro (filtre automatique et sous-totaux)
    Par emmath dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/05/2008, 23h41

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