2010-09-27 4 views
0

J'écris ma première petite application Access 2003. J'ai deux requêtes que je ne peux pas comprendre comment combiner. Ce que je cherche est d'obtenir tous les numéros de routes dans une plage de dates, de compter le nombre total de lignes par route dans la plage de dates et de compter le nombre de lignes en retard. J'ai ces deux requêtes qui me font partie du chemin, je n'arrive pas à comprendre comment les combiner dans une requête Access.Access 2003: Comment combiner deux requêtes de comptage

PARAMETERS StartDate DateTime, EndDate DateTime; 
SELECT [ROUTE #], Count(*) AS Total 
FROM [On time performace audits] 
WHERE ((([On time performace audits].DATE) Between [StartDate] And [EndDate])) 
GROUP BY [Route #]; 

PARAMETERS StartDate DateTime, EndDate DateTime; 
SELECT [Route #], Count(*) as Late 
FROM [On time performace audits] 
WHERE ([On time performace audits].DATE Between [StartDate] And [EndDate]) AND ( Minute([ACTUAL TIME]- [SCHEDULED TIME]) >=6) 
GROUP BY [Route #]; 

Je ne suis pas beaucoup plus d'un type SQL, plus d'un gars LINQ, et d'écrire une application rapide et sale dans Access 2003 après avoir été utilisé pour VS2010 est un peu douloureux. De toute façon, j'espère que vous pouvez aider. Merci.

Répondre

0

Dans votre deuxième exemple de requête, êtes-vous certain de vouloir utiliser la fonction Minute()?

Si vous souhaitez une durée comprise entre 2 valeurs date/heure, utilisez la fonction DateDiff().

Debug.Print DateDiff("n", #2010/09/27 01:00#, #2010/09/27 02:10#) 
70 

Debug.Print Minute(#2010/09/27 02:10# - #2010/09/27 01:00#) 
10 

Si l'approche DateDiff() est ce que vous voulez, essayez ceci:

PARAMETERS StartDate DateTime, EndDate DateTime; 
SELECT t.[ROUTE #], t.Total, l.Late 
FROM 
    (SELECT [ROUTE #], Count(*) AS Total 
    FROM [On time performace audits] 
    WHERE ((([DATE]) Between [StartDate] And [EndDate])) 
    GROUP BY [ROUTE #]) AS t 
    LEFT JOIN (
     SELECT [ROUTE #], Count(*) AS Late 
     FROM [On time performace audits] 
     WHERE ((([DATE]) Between [StartDate] And [EndDate])) 
      And DateDiff("n",[SCHEDULED TIME],[ACTUAL TIME]) >= 6 
     GROUP BY [ROUTE #] 
     ) AS l 
    ON t.[ROUTE #] = l.[ROUTE #]; 

note I ci-joint le nom du champ DATE avec des crochets pour le distinguer de la fonction date VBA().

+0

Vous êtes l'homme! Je vous remercie. J'avais quelque chose de proche à ça une fois, mais je faisais quelque chose de mal parce que ça ne fonctionnait pas. Et merci d'avoir ajouté DateDiff(), je m'en doutais autant avec Minute(). – Deke

0

Vous pouvez également utiliser une UNION [ALL] requête pour tirer des ensembles de résultats en une seule ...

0

la question est de savoir comment combiner les deux requêtes. UNION ALL serait la meilleure façon IMO, comme ceci:

PARAMETERS StartDate DateTime, EndDate DateTime; 
SELECT 'All' As Type, [ROUTE #], Count(*) AS Total 
FROM [On time performace audits] 
WHERE DATE Between StartDate And EndDate 
GROUP BY [Route #] 
UNION ALL 
SELECT 'Late', [Route #], Count(*) 
FROM [On time performace audits] 
WHERE DATE Between StartDate And [EndDate AND 
(Minute([ACTUAL TIME]- [SCHEDULED TIME]) >=6) 
GROUP BY [Route #]; 
+0

A mes yeux, vous avez des crochets déséquilibrés '... Et [EndDate AND ...' – onedaywhen

Questions connexes