2016-04-25 1 views
0

J'essaie d'extraire les ID de folio dont les dates de départ sont supérieures à 30, 60 et 90 jours (tous dans le même fichier). Si l'un des ID comporte également une occurrence dont la date est inférieure à 30 jours, je ne souhaite pas que cette ID soit tirée. Je souhaite également que la date soit tirée pour les ID de folio avec une date de départ vide (null?) Uniquement si cette ID a également une date de départ supérieure à 30, 60 ou 90 jours.La requête Excel/VBA/ADO-SQL ne renvoie pas les résultats corrects

J'ai essayé de nombreuses combinaisons de jointures gauche, interne, droite et imbriquée (grâce aux réponses fournies à une question précédente). Je suis venu près, mais pour une raison quelconque, ma requête ne tire aucune des dates de départ vierges, même si je sais qu'ils existent. Ma requête est jusqu'à présent comme suit:

sSQL = "SELECT t1.[Folio Type], t1.[Folio ID],t1.[Departure Date],t1.[Folio Total]" 
    sSQL = sSQL & " FROM" 
    sSQL = sSQL & " (SELECT [Folio Type], [Folio ID],[Folio Total],[Departure Date]" 
    sSQL = sSQL & " FROM [Individual Folios$B2:O150000] GROUP BY [Folio Type],[Folio ID],[Folio Total],[Departure Date]" 
    sSQL = sSQL & " HAVING [Folio Total] <> 0 and [Departure Date] < " & G30E & ") As t1 " 
    sSQL = sSQL & " LEFT JOIN" 
    sSQL = sSQL & " (SELECT [Folio Type],[Folio ID],[Departure Date],[Folio Total]" 
    sSQL = sSQL & " FROM [Individual Folios$B2:O150000]" 
    sSQL = sSQL & " group by [Folio Type],[Folio ID],[Departure Date],[Folio Total]" 
    sSQL = sSQL & " HAVING [Folio Total] <> 0 and ([Departure Date] > " & G30E & " or [Departure Date] is null)) as t2" 
    sSQL = sSQL & " on t1.[Folio ID] = t2.[Folio ID]" 
    sSQL = sSQL & " where t2.[Folio ID] is null" 

J'ai aussi une requête similaire (qui tente d'accomplir la même chose que la première requête) en utilisant imbriquées les jointures. Je pensais que les deux requêtes devraient tirer les mêmes valeurs, mais les totaux sont différents:

sSQL = "SELECT t1.[Folio Type], t1.[Folio ID],t1.[Departure Date],t1.[Folio Total]" 
sSQL = sSQL & " FROM" 
sSQL = sSQL & " ((SELECT [Folio Type], [Folio ID],[Folio Total],[Departure Date]" 
sSQL = sSQL & " FROM [Individual Folios$B2:O150000] GROUP BY [Folio Type],[Folio ID],[Folio Total],[Departure Date]" 
sSQL = sSQL & " HAVING [Folio Total] <> 0 and [Departure Date] < " & G30E & ") As t1 " 
sSQL = sSQL & " LEFT JOIN" 
sSQL = sSQL & " (SELECT [Folio Type],[Folio ID],[Departure Date],[Folio Total]" 
sSQL = sSQL & " FROM [Individual Folios$B2:O150000]" 
sSQL = sSQL & " group by [Folio Type],[Folio ID],[Departure Date],[Folio Total]" 
sSQL = sSQL & " HAVING [Folio Total] <> 0 and [Departure Date] > " & G30E & ") as t2" 
sSQL = sSQL & " on t1.[Folio ID] = t2.[Folio ID])" 
sSQL = sSQL & " LEFT JOIN" 
sSQL = sSQL & " (SELECT [Folio Type],[Folio ID],[Departure Date],[Folio Total]" 
sSQL = sSQL & " FROM [Individual Folios$B2:O150000]" 
sSQL = sSQL & " group by [Folio Type],[Folio ID],[Departure Date],[Folio Total]" 
sSQL = sSQL & " HAVING [Folio Total] <> 0 and [Departure Date] is null) as t3" 
sSQL = sSQL & " on t1.[Folio ID] = t3.[Folio ID]" 
sSQL = sSQL & " where t2.[Folio ID] is null or t3.[Folio ID] is null" 

Toute aide est grandement appréciée.

Répondre

1

Essayez d'utiliser une série de requêtes UNION. Chaque requête a sa clause WHERE pour restreindre les enregistrements retournés.

Comme la plupart des SELECT est le même j'utiliser une clause WITH:

WITH A AS(SELECT * FROM [FoliosXXX]) 

SELECT * FROM A WHERE [Departure DATE] <= 30 
UNION 
SELECT * FROM A WHERE [Departure DATE] > 30 AND [Departure DATE] <= 60 
UNION 
SELECT * FROM A WHERE [Departure DATE] >= 60 

Vous pouvez faire le SELECT A être un complexe/joint/etc. question. Vous ne savez pas si GROUPing doit ajouter cela aux SELECTs suivants. Une variante consiste à utiliser les UNION et, dans SELECT, à utiliser une clause NOT IN pour exclure les enregistrements déjà traités.

+0

Jet/ACE SQL Engine que OP utilise pour se connecter au classeur Excel ne prend pas en charge les fonctions de fenêtre. 'WITH()' ne fonctionnera pas. – Parfait

+0

Votre droite - sorte de - AVEC ci-dessus est une fonction SQL pas une fonction Windows. Mais vous avez probablement raison de ne pas prendre en charge par Jet ou d'autres pilotes non-SQL Server. Les UNIONS peuvent fonctionner, il suffit de plus de dactylographie. – rheitzman