2017-01-16 3 views
0

J'ai une requête de tabulation croisée avec des dates formatées 'mmm-aaaa' pour les champs dans les colonnes.Date d'ordre dans la requête de tabulation croisée - utiliser la table séparée pour trier

J'ai utilisé la conception ci-dessous pour créer la requête.

Cross Tab Design View

Le problème que j'ai est la date ne sont pas correctement le tri du Dec-17 jusqu'à juil.-16 dans l'ordre décroissant. Cela va être une requête dynamique avec des mois changeant tous les mois donc je veux utiliser une table de données supplémentaire pour faire le tri (par opposition à l'entrée d'une liste de noms de mois dans la fenêtre Propriétés).

Month Order Table

Comment pourrais-je corriger ma requête pour l'obtenir pour ce faire s'il vous plaît?

Merci pour votre aide

+0

Une option consiste à formater les dates en utilisant un format qui sorte correctement, comme:'AAAA-mm'. – Gustav

Répondre

1

Malheureusement, peu importe la façon dont les tables jointes sont triés, tableau croisé triera colonnes par défaut dans l'ordre alphabétique, par conséquent avril, décembre ... commence l'ordre. Pour modifier ou même filtrer l'ordre des colonnes dans les tableaux croisés, vous devez spécifier des valeurs dans la clause PIVOT Col IN() de l'instruction SQL.

Étant donné que vous avez besoin d'une requête dynamique, pensez à créer un fichier queydef dans VBA pour mettre à jour le SQL derrière le tableau croisé où vous mettez à jour dynamiquement la clause PIVOT Col IN(). Bien sûr, passer commencer et terminer les dates au besoin ou par des paramètres:

Public Sub BuildCrossTab() 
    Dim db As Database 
    Dim qdef As QueryDef 
    Dim strSQL As String, dates As String 
    Dim i As Integer, monthsDiff As Integer 

    Set db = CurrentDb 

    ' DELETE PREVIOUS SAVED QUERY 
    For Each qdef in db.QueryDefs 
    If qdef.Name = "AccuralsCrosstabQ" Then 
     db.Execute "DROP Table " & qdef.Name, dbFailOnError 
    End If 
    Next qdef 

    ' LOOP THROUGH ALL MONTHS BACKWARDS 
    dates = "(" 
    monthsDiff = DateDiff("m", #7/1/2016#, #12/1/2016#) 
    For i = monthsDiff To 0 Step -1 
    dates = dates & " '" & Format(DateAdd("m", i, #7/1/2016#), "mmm-yyyy") & "'," 
    Next i 
    dates = dates & ")" 
    dates = Replace(dates, ",)", ")") 

    ' PREPARE SQL STRING 
    strSQL = "TRANSFORM SUM(a.[Amount $]) AS SumAmount" _ 
     & " SELECT a.Company, a.[Accrual ID], SUM(a.[Amount $]) As [Total Amount $]" _ 
     & " FROM [Accruals Raw Data] a " _ 
     & " GROUP BY a.Company, a.[Accrual ID]" _ 
     & " PIVOT Format(a.[Posted Date], ""mmm-yyyy"")" _ 
     & " IN " & dates 

    ' CREATE QUERY 
    Set qdef = db.CreateQueryDef("AccuralsCrosstabQ", strSQL)  

    Set qdef = Nothing 
    Set db = Nothing 
End Sub 
+0

Merci Parfait Je vais essayer ça maintenant. – JDT