Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/06/2011, 11h19   #1
Invité régulier
 
Inscription : mars 2009
Messages : 25
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 25
Points : 7
Points : 7
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 :
Citation:



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 !
Marsupilami23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h29   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h37   #3
Invité régulier
 
Inscription : mars 2009
Messages : 25
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 25
Points : 7
Points : 7
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 :
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 :
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
Marsupilami23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h45   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h50   #5
Invité régulier
 
Inscription : mars 2009
Messages : 25
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 25
Points : 7
Points : 7
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 :
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 !
Marsupilami23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 11h57   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
1
2
 
ORDER BY cycle
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 12h01   #7
Invité régulier
 
Inscription : mars 2009
Messages : 25
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 25
Points : 7
Points : 7
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 :
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 !
Marsupilami23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 12h17   #8
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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 :
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.
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 12h27   #9
Invité régulier
 
Inscription : mars 2009
Messages : 25
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 25
Points : 7
Points : 7
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 :
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.
Marsupilami23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/06/2011, 13h53   #10
Invité régulier
 
Inscription : mars 2009
Messages : 25
Détails du profil
Informations forums :
Inscription : mars 2009
Messages : 25
Points : 7
Points : 7
C'est bon le problème est résolue !

Dans la clause order by, j'ai mis ça :
Code :
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 !
Marsupilami23 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h08.


 
 
 
 
Partenaires

Hébergement Web