OVH Cloud OVH Cloud

Analyse croisée

4 réponses
Avatar
ylb
Bonjour,

Je souhaite effectuer une analyse croisée avec en en tête de colonne des
dates présentées sous la forme MOIS/ANNEE.

Dans je déclare en tête de colonne l'expression
Format([date_real];"mm/aa"), les dates sont triées dans l'ordre numérique du
mois, exemple le 01/06 est avent le 02/05.

Merci d'avance pour votre réponse

4 réponses

Avatar
Drizzit
En effet, pas de chance, mais ton "ORDER BY " doit être basé sur un
champ de ton "SELECT" et du coup "GROUP BY"
La solution consiste à :
- Créer un Query pour ton analyse croisée, dans le genre (heu, à toi
d'adapter à tes besoins, j'ai simplement fait un exemple sur une de
mes bases) :
TRANSFORM Sum(Montant) AS SumOfMontant
SELECT Format([DateOperation],"mm/yy") AS MaDate, Sum(Montant) AS
[Total Of Montant]
FROM tblOperation
GROUP BY Format([DateOperation],"mm/yy")
PIVOT IdDomaine;

Admettons que cette analyse croisée on l'enregistre sous
"MonAnalyseCroisee"

- La deuxième étape consiste à faire la requête suivante :
SELECT MonAnalyseCroisee.*
FROM MonAnalyseCroisee
ORDER BY Right([MaDate],2) & Left([MaDate],2);

Je sais, c'est pas très élégant, mais ça fonctionne.
Avatar
ylb

En effet, pas de chance, mais ton "ORDER BY " doit être basé sur un
champ de ton "SELECT" et du coup "GROUP BY"
La solution consiste à :
- Créer un Query pour ton analyse croisée, dans le genre (heu, à toi
d'adapter à tes besoins, j'ai simplement fait un exemple sur une de
mes bases) :
TRANSFORM Sum(Montant) AS SumOfMontant
SELECT Format([DateOperation],"mm/yy") AS MaDate, Sum(Montant) AS
[Total Of Montant]
FROM tblOperation
GROUP BY Format([DateOperation],"mm/yy")
PIVOT IdDomaine;

Admettons que cette analyse croisée on l'enregistre sous
"MonAnalyseCroisee"

- La deuxième étape consiste à faire la requête suivante :
SELECT MonAnalyseCroisee.*
FROM MonAnalyseCroisee
ORDER BY Right([MaDate],2) & Left([MaDate],2);

Je sais, c'est pas très élégant, mais ça fonctionne.


Merci de votre réponse,

votre solution fonctionne si la date est en entete de ligne, mais moi je
souhaite avoir les dates en entete de colonne.
Merci d'avance

Avatar
Drizzit
Oups, j'ai mal lu...
Alors voilà une petite solution que j'ai élaboré. Attention, on
décole.

On image, on a toujours notre Query Analyse Croisé "MonAnalyseCroisee"
TRANSFORM Sum(tblOperation.Montant) AS SumOfMontant
SELECT tblOperation.IdDomaine, Sum(tblOperation.Montant) AS [Total Of
Montant]
FROM tblOperation
GROUP BY tblOperation.IdDomaine
ORDER BY Format([DateOperation],"mm/yy")
PIVOT Format([DateOperation],"mm/yy");

On a en plus une autre Query "qryDansLeBonOrdre", dont le SQL va etre
modifié par une fonction ( dont le code (à réadapter) est
ci-dessous) afin d'avoir les colonnes dans le bon ordre.

Public Function ConstructionSQL()

Dim objRs As Recordset
Dim strSQL As String
Dim objQuery As QueryDef

' Ici on cherche les valeurs distinct des colonnes qu'on va avoir
' A adapter en fonction de ton query de ton Analyse croisée
strSQL = _
" SELECT distinct Format([DateOperation],'mm/yy') as expr1,
Format([DateOperation],'yy/mm') as expr2 " & _
" FROM tblOperation " & _
" ORDER BY Format([DateOperation],'yy/mm')"

Set objRs = CurrentDb.OpenRecordset(strSQL)
strSQL = ""
' On parcours tous les résultats, qui vont correspondre aux nom
' des colonnes de l'analyse croisée
Do
If objRs.EOF Then Exit Do
' Concaténation des champs
strSQL = strSQL & IIf(strSQL = "", "", ", ") & _
"[" & objRs("Expr1") & "]"
objRs.MoveNext
Loop

' Modification du SQL de qryDansLeBonOrdre
Set objQuery = CurrentDb.QueryDefs("qryDansLeBonOrdre")
objQuery.SQL = _
" SELECT IdDomaine, [Total Of Montant], " & strSQL & _
" FROM MonAnalyseCroisee "
objQuery.Close
Set objQuery = Nothing

' Et la tu peux ouvrir qryDansLeBonOrdre
End Function

En espérant que cela va pouvoir t'aider.
Avatar
ylb

Oups, j'ai mal lu...
Alors voilà une petite solution que j'ai élaboré. Attention, on
décole.

On image, on a toujours notre Query Analyse Croisé "MonAnalyseCroisee"
TRANSFORM Sum(tblOperation.Montant) AS SumOfMontant
SELECT tblOperation.IdDomaine, Sum(tblOperation.Montant) AS [Total Of
Montant]
FROM tblOperation
GROUP BY tblOperation.IdDomaine
ORDER BY Format([DateOperation],"mm/yy")
PIVOT Format([DateOperation],"mm/yy");

On a en plus une autre Query "qryDansLeBonOrdre", dont le SQL va etre
modifié par une fonction ( dont le code (à réadapter) est
ci-dessous) afin d'avoir les colonnes dans le bon ordre.

Public Function ConstructionSQL()

Dim objRs As Recordset
Dim strSQL As String
Dim objQuery As QueryDef

' Ici on cherche les valeurs distinct des colonnes qu'on va avoir
' A adapter en fonction de ton query de ton Analyse croisée
strSQL = _
" SELECT distinct Format([DateOperation],'mm/yy') as expr1,
Format([DateOperation],'yy/mm') as expr2 " & _
" FROM tblOperation " & _
" ORDER BY Format([DateOperation],'yy/mm')"

Set objRs = CurrentDb.OpenRecordset(strSQL)
strSQL = ""
' On parcours tous les résultats, qui vont correspondre aux nom
' des colonnes de l'analyse croisée
Do
If objRs.EOF Then Exit Do
' Concaténation des champs
strSQL = strSQL & IIf(strSQL = "", "", ", ") & _
"[" & objRs("Expr1") & "]"
objRs.MoveNext
Loop

' Modification du SQL de qryDansLeBonOrdre
Set objQuery = CurrentDb.QueryDefs("qryDansLeBonOrdre")
objQuery.SQL = _
" SELECT IdDomaine, [Total Of Montant], " & strSQL & _
" FROM MonAnalyseCroisee "
objQuery.Close
Set objQuery = Nothing

' Et la tu peux ouvrir qryDansLeBonOrdre
End Function

En espérant que cela va pouvoir t'aider.


Merci pour votre réponse.


Je pense que je vais simplement intervertir le mois et l'année et comme cela
le tri sera correct.
Il suffira de s'habituer au nouveau format d'affichage.