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 :

Problème d'affichage de sous-totaux


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    195
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 195
    Points : 62
    Points
    62
    Par défaut Problème d'affichage de sous-totaux
    Salut tout le monde,

    Je veux calculer des sous-totaux et les afficher sous une forme précise, mais je ne réussi pas à le faire. Voici une illustration de ce que j'ai pu obtenir avec la requête suivante et en bas le résultat souhaité :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select codeClient,  codeOperateur,  libelleOperation, codeOperation, sum(fraisEngendre) as "Frais Engendré" From T_TypeOpertaion group by codeClient, codeOperateur, libelleOperation, codeOperation with rollup
    Résultat Obtenu:
    Nom : Résultat_Obtenu.JPG
Affichages : 82
Taille : 40,0 Ko

    Résultat Souhaité:
    Nom : Résultat_Souhaité.JPG
Affichages : 76
Taille : 21,4 Ko

    comme vous pouvez le remarquer on s'interesse seulement aux sous-totaux de chaque Opérateur et de chaque Client sans prendre compte de l'Opération ou de son code.

    il y'a aussi une autre remarque, c'est quand on se dispose d'un opérateur qui a effectué une seule opération on a pas besoin de calculer son sous total.

    J'espere que le problème est bien présenté, j'ai vraiment besoin de votre aide car je suis totalement bloqué.

    Je vous remercie d'avance,

    Cordialement.

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Utilisez pour ce faire la fonction GROUPING() avec le prédicat CASE

    @++

  3. #3
    Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    195
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 195
    Points : 62
    Points
    62
    Par défaut
    merci pour la proposition, je me suis documenté sur Grouping et Case mais je ne vois pas comment les utiliser dans mon cas...sinon il ne y'aura pas une autre solution pour calculer les sous-totaux en précisant just les champs concernés sans passer par rollup?

  4. #4
    Membre averti

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Points : 351
    Points
    351
    Par défaut deux solutions possibles à tester
    Bonjour,
    Je vois deux solutions à tester :

    - la première qui me vient à l'esprit est de calculer séparément les données puis les rassembler, qq chose comme cela :

    SELECT codeClient, codeOperateur, 'tous' AS libelleOperation, NULL AS codeOperation, sum(fraisEngendre) AS "Frais Engendré"
    FROM T_TypeOpertaion
    GROUP BY codeClient, codeOperateur
    UNION
    SELECT codeClient, codeOperateur, libelleOperation, codeOperation, fraisEngendre AS "Frais Engendré"
    FROM T_TypeOpertaion

    Si vous avez ensuite un problème de tri, il suffit d'ajouter une colonne pour spécifier le tri.

    - la deuxième est avec les GROUPING dont parle "elsuket". Dans un premier temps on l'utilise pour spécifier le nom dans la colonne [libelleOperation] pour la ligne de sous total, ici j'ai mis "tous".
    Puis on l'utilise comme filtre pour le Group By avec HAVING ...
    Là je lui ai indiqué de mettre les lignes qui n'ont pas de totaux ainsi que les lignes qui ont un total sur [libelleOperation]

    Bon courage et pour info http://msdn.microsoft.com/fr-fr/libr...SQL.90%29.aspx.

    p.s : attention il est écrit "T_TypeOpertaion" et non "T_TypeOperation" dans votre script initial

  5. #5
    Membre averti

    Profil pro
    En reconversion
    Inscrit en
    Novembre 2007
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : En reconversion

    Informations forums :
    Inscription : Novembre 2007
    Messages : 180
    Points : 351
    Points
    351
    Par défaut
    Pardon j'ai oublié de coller le script de la deuxième solution, cela ressemblerait à qq chose comme cela :

    SELECT codeClient ,codeOperateur
    ,CASE WHEN (GROUPING(libelleOperation) = 1) THEN 'tous' ELSE ISNULL(libelleOperation, 'inconnu') END AS libelleOperation
    ,codeOperation
    ,sum(fraisEngendre) AS "Frais Engendré"
    FROM T_TypeOpertaion
    GROUP BY codeClient, codeOperateur, libelleOperation, codeOperation WITH ROLLUP
    HAVING GROUPING(codeOperation) <> 1 OR ( GROUPING(libelleOperation) = 1 AND GROUPING(codeOperateur) <> 1 )

Discussions similaires

  1. [AC-2007] [Problème d'affichage] Formulaire - Sous-Formulaire
    Par kuan01 dans le forum IHM
    Réponses: 6
    Dernier message: 23/06/2010, 11h32
  2. Problème d'affichage background sous Firefox.
    Par myjinks dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 21/01/2008, 20h08
  3. Problème d'affichage JSP sous IE7.0
    Par Kawelito dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 10/04/2007, 15h59
  4. Réponses: 6
    Dernier message: 19/05/2005, 11h06

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