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 :

Regrouper des champs de même type dans la même table


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 18
    Points
    18
    Par défaut Regrouper des champs de même type dans la même table
    Bonjour, en ayant récupérer des données concernant le montant facturé selon un type de charge sur un cycle de facturation, j'ai obtenu le bon résultat. Mais en analysant la liste retournée, j'ai trouvé des lignes pour un même type de charge qui se repete avec un montant bien sur différent et sur la même période de facturation. Cela est normal car la période de facturation (jour de facturation ) est différent, or moi je récupère le cycle par mois de facturation.

    Comment je peux regrouper ces lignes pour un même type de charge ?

    Ma requête est la suivante :



    SELECT SUM (FDF_MONTANT) AS Montant_Facturé
    ,DTC_LIB_CODE_TYPE_CHARGE as charge
    ,(CONVERT(VARCHAR(20),DATENAME(M,FAC_DATE_FIN_PERIODE_FACTURATION)) + ' - ' + CONVERT(VARCHAR(20),YEAR(FAC_DATE_FIN_PERIODE_FACTURATION))) as cycle
    ,FAC_DATE_FIN_PERIODE_FACTURATION

    FROM dbo.ABI_FCT_DETAIL_FACTURE (NOLOCK)

    LEFT OUTER JOIN dbo.ABI_DIM_TYPE_CHARGE (NOLOCK)
    ON FDF_TYPE_CHARGE_FK = DTC_CODE_TYPE_CHARGE_PK

    LEFT OUTER JOIN dbo.ABI_FCT_FACTURE (NOLOCK)
    ON FDF_NUMERO_FACTURE = FAC_NUMERO_FACTURE

    WHERE FAC_DATE_FIN_PERIODE_FACTURATION IS NOT NULL

    GROUP BY DTC_LIB_CODE_TYPE_CHARGE
    ,FAC_DATE_FIN_PERIODE_FACTURATION

    ORDER BY FAC_DATE_FIN_PERIODE_FACTURATION ASC
    J'avoue que ma question est un peu bête, mais j'ai essayé de mettre le résultat dans une table temporaire, et faire un inner join sur le champ type charge , et faire la somme des montants. Le résultat que j'ai obtenu n'était pas bon .

    Donc je ne sais pas q'il y'a une autre idée ?

    Merci pour l'aide !

  2. #2
    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

    Si j'ai bien compris votre probleme, il vous suffit de grouper également sur le mois (sans tenir compte du jour) donc en fait de grouper sur la troisième colonne de votre resultat :

    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
     
    SELECT SUM (FDF_MONTANT) AS Montant_Facturé
    ,DTC_LIB_CODE_TYPE_CHARGE as charge
    ,(CONVERT(VARCHAR(20),DATENAME(M,FAC_DATE_FIN_PERIODE_FACTURATION)) + ' - ' + CONVERT(VARCHAR(20),YEAR(FAC_DATE_FIN_PERIODE_FACTURATION))) as cycle
    ,FAC_DATE_FIN_PERIODE_FACTURATION
     
    FROM dbo.ABI_FCT_DETAIL_FACTURE (NOLOCK)
     
    LEFT OUTER JOIN dbo.ABI_DIM_TYPE_CHARGE (NOLOCK)
    ON FDF_TYPE_CHARGE_FK = DTC_CODE_TYPE_CHARGE_PK
     
    LEFT OUTER JOIN dbo.ABI_FCT_FACTURE (NOLOCK)
    ON FDF_NUMERO_FACTURE = FAC_NUMERO_FACTURE
     
    WHERE FAC_DATE_FIN_PERIODE_FACTURATION IS NOT NULL
     
    GROUP BY DTC_LIB_CODE_TYPE_CHARGE
    ,FAC_DATE_FIN_PERIODE_FACTURATION
    ,CONVERT(VARCHAR(20),DATENAME(M,FAC_DATE_FIN_PERIODE_FACTURATION)) + ' - ' + CONVERT(VARCHAR(20),YEAR(FAC_DATE_FIN_PERIODE_FACTURATION))
     
    ORDER BY FAC_DATE_FIN_PERIODE_FACTURATION ASC

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour

    Si j'ai bien compris votre probleme, il vous suffit de grouper également sur le mois (sans tenir compte du jour) donc en fait de grouper sur la troisième colonne de votre resultat :

    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
     
    SELECT SUM (FDF_MONTANT) AS Montant_Facturé
    ,DTC_LIB_CODE_TYPE_CHARGE as charge
    ,(CONVERT(VARCHAR(20),DATENAME(M,FAC_DATE_FIN_PERIODE_FACTURATION)) + ' - ' + CONVERT(VARCHAR(20),YEAR(FAC_DATE_FIN_PERIODE_FACTURATION))) as cycle
    ,FAC_DATE_FIN_PERIODE_FACTURATION
     
    FROM dbo.ABI_FCT_DETAIL_FACTURE (NOLOCK)
     
    LEFT OUTER JOIN dbo.ABI_DIM_TYPE_CHARGE (NOLOCK)
    ON FDF_TYPE_CHARGE_FK = DTC_CODE_TYPE_CHARGE_PK
     
    LEFT OUTER JOIN dbo.ABI_FCT_FACTURE (NOLOCK)
    ON FDF_NUMERO_FACTURE = FAC_NUMERO_FACTURE
     
    WHERE FAC_DATE_FIN_PERIODE_FACTURATION IS NOT NULL
     
    GROUP BY DTC_LIB_CODE_TYPE_CHARGE
    ,FAC_DATE_FIN_PERIODE_FACTURATION
    ,CONVERT(VARCHAR(20),DATENAME(M,FAC_DATE_FIN_PERIODE_FACTURATION)) + ' - ' + CONVERT(VARCHAR(20),YEAR(FAC_DATE_FIN_PERIODE_FACTURATION))
     
    ORDER BY FAC_DATE_FIN_PERIODE_FACTURATION ASC


    BOnjour, merci pour votre proposition.
    J'ai donc ajouté la ligne au niveau du group by mais j'ai toujours le même problème.


    Pour plus de détails, voilà le résultat obtenu (Je n'affiche plus la date entière de facturation):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    457	                        frais ponctuel	juin - 2009
    -95670,36	                 OCC	                juin - 2009
    2170862,7539	        consommation	juin - 2009
    811748,399200003	frais récurrent	juin - 2009
    114,1935	                frais récurrent	juin - 2009
    -778,49	                OCC	                 juin - 2009

    Pour la période de Juin 2009 ligne 2 et 7 type charge OCC il faudrait qu'il me fasse la somme des montants. Idem pour ligne 5 et 6.

    J'ai ce même problème sur plsuieurs période

  4. #4
    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
    en effet !

    je suis allé un peu vite en besogne, et je n'ai pas fait attention à la colonne reprenant la date entière.

    il faut donc retirer cette colonne de la liste du SELECT (ce que vous avez fait), mais également du GROUP BY !

    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
     
    SELECT SUM (FDF_MONTANT) AS Montant_Facturé
    ,DTC_LIB_CODE_TYPE_CHARGE AS charge
    ,(CONVERT(VARCHAR(20),DATENAME(M,FAC_DATE_FIN_PERIODE_FACTURATION)) + ' - ' + CONVERT(VARCHAR(20),YEAR(FAC_DATE_FIN_PERIODE_FACTURATION))) AS cycle
     
    FROM dbo.ABI_FCT_DETAIL_FACTURE (NOLOCK)
     
    LEFT OUTER JOIN dbo.ABI_DIM_TYPE_CHARGE (NOLOCK)
    ON FDF_TYPE_CHARGE_FK = DTC_CODE_TYPE_CHARGE_PK
     
    LEFT OUTER JOIN dbo.ABI_FCT_FACTURE (NOLOCK)
    ON FDF_NUMERO_FACTURE = FAC_NUMERO_FACTURE
     
    WHERE FAC_DATE_FIN_PERIODE_FACTURATION IS NOT NULL
     
    GROUP BY DTC_LIB_CODE_TYPE_CHARGE
    ,CONVERT(VARCHAR(20),DATENAME(M,FAC_DATE_FIN_PERIODE_FACTURATION)) + ' - ' + CONVERT(VARCHAR(20),YEAR(FAC_DATE_FIN_PERIODE_FACTURATION))
     
    ORDER BY FAC_DATE_FIN_PERIODE_FACTURATION ASC

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    en effet !

    je suis allé un peu vite en besogne, et je n'ai pas fait attention à la colonne reprenant la date entière.

    il faut donc retirer cette colonne de la liste du SELECT (ce que vous avez fait), mais également du GROUP BY !

    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
     
    SELECT SUM (FDF_MONTANT) AS Montant_Facturé
    ,DTC_LIB_CODE_TYPE_CHARGE AS charge
    ,(CONVERT(VARCHAR(20),DATENAME(M,FAC_DATE_FIN_PERIODE_FACTURATION)) + ' - ' + CONVERT(VARCHAR(20),YEAR(FAC_DATE_FIN_PERIODE_FACTURATION))) AS cycle
     
    FROM dbo.ABI_FCT_DETAIL_FACTURE (NOLOCK)
     
    LEFT OUTER JOIN dbo.ABI_DIM_TYPE_CHARGE (NOLOCK)
    ON FDF_TYPE_CHARGE_FK = DTC_CODE_TYPE_CHARGE_PK
     
    LEFT OUTER JOIN dbo.ABI_FCT_FACTURE (NOLOCK)
    ON FDF_NUMERO_FACTURE = FAC_NUMERO_FACTURE
     
    WHERE FAC_DATE_FIN_PERIODE_FACTURATION IS NOT NULL
     
    GROUP BY DTC_LIB_CODE_TYPE_CHARGE
    ,CONVERT(VARCHAR(20),DATENAME(M,FAC_DATE_FIN_PERIODE_FACTURATION)) + ' - ' + CONVERT(VARCHAR(20),YEAR(FAC_DATE_FIN_PERIODE_FACTURATION))
     
    ORDER BY FAC_DATE_FIN_PERIODE_FACTURATION ASC



    J'ai déjà testé celà !
    Je suis sous sql server 2005 et voilà l'erreur qu'il me donne :

    La colonne "dbo.ABI_FCT_FACTURE.FAC_DATE_FIN_PERIODE_FACTURATION" n'est pas valide dans la clause ORDER BY parce qu'elle n'est pas contenue dans une fonction d'agrégation ou dans la clause GROUP BY.

    Il faut donc enlever l'order BY, or moi je le garde afin d'avoir la chronologie des évènements par date , et c'est plus facile de vérifier avec !

    Je vais quand même regrouper manuellement histoire de vérifier si le regroupement a été fait !

  6. #6
    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
    décidément !

    je ne l'avais pas vu non plus celui-là

    vous pouvez aussi ordonner les résultats selon le mois et l'année :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORDER BY cycle

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    décidément !

    je ne l'avais pas vu non plus celui-là

    vous pouvez aussi ordonner les résultats selon le mois et l'année :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORDER BY cycle
    Oui effectivement , il a bien fait la somme. Je vous remercie !

    Si je mets l'alias au niveau de l'order by, j'aurai un tri certes, mais un tri alphabétique selon le mois, et donc je n'y gagne rien.
    Ce que je souhaiterai garder c bien l'enchaînement réelle des facturation par ordre mensuelle de l'année considérée.

    Je vais mettre la discussion en résolue , le temps de trouver une alternative pour le tri.

    Vraiment merci !

  8. #8
    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
    arfff, à force de rater, on va bien finir par réussir

    votre méthode pour calculer le mois est de toute façon perfectible. Souhaitez vous absolument garder ce format ?

    Vous pouvez trouver facilement le 1er du mois (au format date) en faisant ceci :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DATEADD(
        MONTH,
        DATEDIFF (
            MONTH,
            0,
            FAC_DATE_FIN_PERIODE_FACTURATION
        ),
        0
    ) AS cycle

    ce sera peut être un peu plus performant, et comme vous gardez le format date, le tri s'effectue correctement.

  9. #9
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    arfff, à force de rater, on va bien finir par réussir

    votre méthode pour calculer le mois est de toute façon perfectible. Souhaitez vous absolument garder ce format ?

    Vous pouvez trouver facilement le 1er du mois (au format date) en faisant ceci :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    DATEADD(
        MONTH,
        DATEDIFF (
            MONTH,
            0,
            FAC_DATE_FIN_PERIODE_FACTURATION
        ),
        0
    ) AS cycle

    ce sera peut être un peu plus performant, et comme vous gardez le format date, le tri s'effectue correctement.

    Il serait préférable de garder mon format car ces résultats sont destinés à être affiché dans un tableau de bord, et donc dans le but de plus de visibilité pour le lecteur, il vaudrait mieux avoir une période mois année plutôt <ue la donnée brut de la date.
    D'autant plus, que les graphiques seront construits à l'aide de SSRS (que je ne connais pas pour le moment), donc il sera difficile de changer la mise en forme manuellement (Au sens d'une utilisation à l'aide de Microsoft Excel, ce qui ne sera pas le cas)


    Car il n'accepte vraiment pas qu'on mette un champ dans ORDER BY sans l'avoir mis dans le GROUP BY.

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    C'est bon le problème est résolue !

    Dans la clause order by, j'ai mis ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ORDER BY   YEAR(FAC_DATE_FIN_PERIODE_FACTURATION) *1000 + MONTH(FAC_DATE_FIN_PERIODE_FACTURATION) ASC

    Je peux donc garder le formatage de la date tel qu'il est !

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 24/11/2011, 03h30
  2. Réponses: 14
    Dernier message: 13/07/2007, 13h05
  3. [Requête]Regrouper des champs d'un mème enregistrement
    Par jojo_perso dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 22/04/2007, 23h25
  4. Réponses: 1
    Dernier message: 26/12/2006, 17h23
  5. Regrouper des champs dans un GROUP BY
    Par kaiserazo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 11/07/2005, 09h43

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