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 :

Regroupage de certains nom au sein d'une même colonne


Sujet :

Développement SQL Server

  1. #1
    Membre régulier Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 73
    Points
    73
    Par défaut Regroupage de certains nom au sein d'une même colonne
    Bonjour,
    je travaille actuellement avec un médecin au sein d'une ONG qui souhaite tirer des informations de sa bdd et je souhaite l'aider.
    Le problème est le suivant: il aimerait savoir la somme des dépenses par année, par hôpital, par type de dépense dans l'hôpital.
    Je lui ai fourni cette information avec la requète suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT    year(TblPolicyClaim.DischargeDate) as "Year", TblPolicy.PolicyNr, TblClaimDetails.ClaimID ,TblClaimDetails.ClaimExpenseType,TblPolicyClaim.Disease,TblPolicyClaim.DiseaseType,TblPolicyClaim.DiseaseSubTyp, TblClaimDetails.Hospital, SUM(TblClaimDetails.ExpensesBilled) AS SumExpenses,sum(TblClaimDetails.AmountClaimable) as AmountClaimable         
    FROM         TblClaimDetails  INNER JOIN
                          TblPolicyClaim ON TblClaimDetails.ClaimID = TblPolicyClaim.ClaimID INNER JOIN
                          TblPolicy ON TblPolicyClaim.PolicyID = TblPolicy.PolicyID
    where YEAR(TblPolicyClaim.DischargeDate)>=2008 and TblPolicy.PolicyNr like 'PE%' 
    GROUP BY TblPolicyClaim.DischargeDate, TblPolicy.PolicyNr,TblClaimDetails.ClaimID,TblClaimDetails.ClaimExpenseType ,TblPolicyClaim.Disease, TblPolicyClaim.DiseaseType,TblPolicyClaim.DiseaseSubTyp,TblClaimDetails.Hospital, TblPolicy.PolicyNr
    ORDER BY TblPolicyClaim.DischargeDate, TblPolicy.PolicyNr
    Maintenant, il aimerait regrouper certains item de la colonne TblClaimDetails.ClaimExpenseType mais je ne sais pas comment faire.
    Cela ressemble pour moi à une structure conditionnelle sur une boucle (SI tel nom ALORS additionner cette somme dans le tampon), mais comme je ne connais pas bien les bases de donnée, je me demandais s'il existait une manière de faire cela autrement.

    Par exemple,
    il voudrait savoir la somme des dépenses pour:
    frais de lit,
    frais de nourriture,
    qu'il regroupe sous un sous-item "frais d'hôpitaux"
    et pour:
    frais de médecin,
    frais d'infirmiers,
    frais de kiné,
    qu'il regroupe sous un sous-item "personnels médicaux"


    Sauriez-vous m'aider ?

  2. #2
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Points : 22
    Points
    22
    Par défaut Salut Figarojuju
    Essaie peut-être quelque chose comme ça:
    (attention code non testé)

    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
     
    SELECT    
    	CAST('Frais d''hopitaux' AS Varchar(50)) AS TypeDepense, 
    	year(TblPolicyClaim.DischargeDate) AS "Year", 
    	TblPolicy.PolicyNr,
    	TblPolicyClaim.Disease,
    	TblPolicyClaim.DiseaseType,
    	TblPolicyClaim.DiseaseSubTyp, 
    	TblClaimDetails.Hospital, 
    	SUM(TblClaimDetails.ExpensesBilled) AS SumExpenses,
    	SUM(TblClaimDetails.AmountClaimable) AS AmountClaimable         
    FROM         
    	TblClaimDetails  INNER JOIN
    		TblPolicyClaim ON TblClaimDetails.ClaimID = TblPolicyClaim.ClaimID INNER JOIN
                          TblPolicy ON TblPolicyClaim.PolicyID = TblPolicy.PolicyID
    WHERE 
    	YEAR(TblPolicyClaim.DischargeDate)>=2008 
    	AND TblPolicy.PolicyNr LIKE 'PE%' 
    	AND TblClaimDetails.ClaimExpenseType IN ('Frais de lit', 'Frais de nourriture')
    GROUP BY 
    	TblPolicyClaim.DischargeDate, 
    	TblPolicy.PolicyNr,
    	TblPolicyClaim.Disease, 
    	TblPolicyClaim.DiseaseType,
    	TblPolicyClaim.DiseaseSubTyp,
    	TblClaimDetails.Hospital, 
    	TblPolicy.PolicyNr
     
    UNION ALL
     
    SELECT    
    	CAST('Personnels médicaux' AS Varchar(50)), 
    	year(TblPolicyClaim.DischargeDate), 
    	TblPolicy.PolicyNr,
    	TblPolicyClaim.Disease,
    	TblPolicyClaim.DiseaseType,
    	TblPolicyClaim.DiseaseSubTyp, 
    	TblClaimDetails.Hospital, 
    	SUM(TblClaimDetails.ExpensesBilled),
    	SUM(TblClaimDetails.AmountClaimable)         
    FROM         
    	TblClaimDetails  INNER JOIN
    		TblPolicyClaim ON TblClaimDetails.ClaimID = TblPolicyClaim.ClaimID INNER JOIN
                          TblPolicy ON TblPolicyClaim.PolicyID = TblPolicy.PolicyID
    WHERE 
    	YEAR(TblPolicyClaim.DischargeDate)>=2008 
    	AND TblPolicy.PolicyNr LIKE 'PE%' 
    	AND TblClaimDetails.ClaimExpenseType IN ('Frais de médecin', 'Frais d''infirmiers', 'Frais de kiné')
    GROUP BY 
    	TblPolicyClaim.DischargeDate, 
    	TblPolicy.PolicyNr,
    	TblPolicyClaim.Disease, 
    	TblPolicyClaim.DiseaseType,
    	TblPolicyClaim.DiseaseSubTyp,
    	TblClaimDetails.Hospital, 
    	TblPolicy.PolicyNr
     
    ORDER BY 
    	TblPolicyClaim.DischargeDate, 
    	TblPolicy.PolicyNr

  3. #3
    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,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE 
    	YEAR(TblPolicyClaim.DischargeDate)>=2008
    Il vaudrait mieux écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE TblPolicyClaim.DischargeDate >= '20080101'
    Parce que dans le premier cas, il n'est pas possible pour SQL Server d'estimer le nombre de lignes qui vont vérifier le prédicat, du fait de l'application d'une fonction sur la colonne DischargeDate.
    En conséquence, il ne peut pas utiliser un index qui serait sur cette même colonne, et qui accélérerait probablement le temps de traitement de cette requête

    @++

  4. #4
    Rédacteur
    Avatar de WOLO Laurent
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Mars 2003
    Messages
    2 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Congo-Brazzaville

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

    Informations forums :
    Inscription : Mars 2003
    Messages : 2 741
    Points : 4 414
    Points
    4 414
    Par défaut
    Tres bon conseil d'optimisation elsuket.

    figarojuju utilises la construction .

    Découvrez la FAQ de MS SQL Server.
    La chance accorde ses faveurs aux esprits avertis !

  5. #5
    Membre à l'essai
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2011
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2011
    Messages : 17
    Points : 22
    Points
    22
    Par défaut Bonjour à tous
    WOLO Laurent, tu conseilles à figarojuju d'utiliser Case..When, personnellement je ne vois pas trop comment il peut faire pour dégrouper son agrégat avec cette solution, peux-tu expliquer stp? A moins que cela soit clair pour tout le monde...

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2012
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2012
    Messages : 7
    Points : 10
    Points
    10
    Par défaut
    je pense plus a quelque chose qui ressemble à ça :


    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
    SELECT    
    	CAST('Personnels médicaux' AS Varchar(50)), 
    	year(TblPolicyClaim.DischargeDate), 
    	TblPolicy.PolicyNr,
    	TblPolicyClaim.Disease,
    	TblPolicyClaim.DiseaseType,
    	TblPolicyClaim.DiseaseSubTyp, 
    	TblClaimDetails.Hospital, 
    	SUM (CASE WHEN TblClaimDetails.ClaimExpenseType IN ('Frais de médecin', 'Frais d''infirmiers', 'Frais de kiné')
    	THEN  TblClaimDetails.ExpensesBilled END) 'Bill des medecin',
    	SUM (CASE WHEN TblClaimDetails.ClaimExpenseType IN ('Frais de lit', 'Frais de nourriture')
    	THEN  TblClaimDetails.ExpensesBilled END) 'Frais divers'
     	   
    FROM         
    	TblClaimDetails  INNER JOIN
    		TblPolicyClaim ON TblClaimDetails.ClaimID = TblPolicyClaim.ClaimID INNER JOIN
                          TblPolicy ON TblPolicyClaim.PolicyID = TblPolicy.PolicyID
    WHERE 
    	YEAR(TblPolicyClaim.DischargeDate)>=2008 
    	AND TblPolicy.PolicyNr LIKE 'PE%' 
    GROUP BY 
    	TblPolicyClaim.DischargeDate, 
    	TblPolicy.PolicyNr,
    	TblPolicyClaim.Disease, 
    	TblPolicyClaim.DiseaseType,
    	TblPolicyClaim.DiseaseSubTyp,
    	TblClaimDetails.Hospital, 
    	TblPolicy.PolicyNr
    ORDER BY 
    	TblPolicyClaim.DischargeDate, 
    	TblPolicy.PolicyNr

  7. #7
    Membre régulier Avatar de figarojuju
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Avril 2006
    Messages : 133
    Points : 73
    Points
    73
    Par défaut Résolu
    Parfait, la solution case...correspond à ce que je souhaite faire !
    Merci Bonne journée !

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

Discussions similaires

  1. regrouper du code html au sein d'une même page?
    Par mikeulkeul66 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 13/01/2010, 17h11
  2. Copier un projet au sein d'une même solution
    Par oodini dans le forum Visual Studio
    Réponses: 5
    Dernier message: 20/12/2009, 18h44
  3. [PHP 5.2] Naviguer au sein d'une même session
    Par vincent.mbg dans le forum Langage
    Réponses: 2
    Dernier message: 27/09/2009, 11h50
  4. Concaténation au sein d'une même feuille Excel
    Par stephaneparis dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 27/03/2009, 19h35

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