2009-12-20 4 views
2

J'essaie de renvoyer les 4 dernières années de données d'un ID, si elles existent. Le tableau (appelez-le A_TABLE) ressemble à ceci: ID, Année, Val#Erreur apparaissant dans plusieurs instructions LEFT JOIN Requête d'accès lorsque la valeur doit être NULL

L'idée derrière la requête est la suivante: pour chaque ID/Année dans le tableau, LEFT JOIN avec Année-1, Année-2 et Année -3 (pour obtenir 4 années de données), puis retourner Val pour chaque année. Voici le SQL:

SELECT a.ID, a.year AS [Year], a.Val AS VAL, 
    a1.year AS [Year-1], a1.Val AS [VAL-1], 
    a2.year AS [Year-2], a2.Val AS [VAL-2], 
    a3.year AS [Year-3], a3.Val AS [VAL-3] 
FROM (
    ([A_TABLE] AS a 
    LEFT JOIN [A_TABLE] AS a1 ON (a.ID = a1.ID) AND (a.year = a1.year+1)) 
    LEFT JOIN [A_TABLE] AS a2 ON (a.ID = a2.ID) AND (a.year = a2.year+2)) 
    LEFT JOIN [A_TABLE] AS a3 ON (a.ID = a3.ID) AND (a.year = a3.year+3) 

Le problème est que, pour des années précédentes où il n'y a pas de données (par exemple, année 1), je vois « #Erreur » dans la colonne VAL appropriée (par exemple, [VAL-1 ]). La chose étrange est, je vois le "nul" attendu dans la colonne Année (par exemple, [YEAR-1]).

Certaines données de l'échantillon:

ID  YEAR VAL 
Dave 2004 1 
Dave 2006 2 
Dave 2007 3 
Dave 2008 5 
Dave 2009 0 

sorties comme celle-ci:

ID YEAR VAL YEAR-1 VAL-1 YEAR-2 VAL-2 YEAR-3 VAL-3 
Dave 2004 1   #Error   #Error   #Error 
Dave 2006 2   #Error 2004 1    #Error 
Dave 2007 3 2006 2    #Error 2004 1 
Dave 2008 5 2007 3  2006 2    #Error 
Dave 2009 0 2008 5  2007 3  2006 2 

Est-ce que sens? Pourquoi est-ce que j'obtiens la valence NULL appropriée pour les ANNÉES inexistantes, mais une #Erreur pour les VALs non-existantes?

(Ceci est Access 2000. Les instructions conditionnelles comme "IIf (a1.val est nul, -999, a1.val)" ne semble pas faire quoi que ce soit.)

EDIT: Il se trouve que les erreurs sont en quelque sorte causés par le fait que A_TABLE est en fait une requête. Lorsque je place toutes les données dans un tableau et exécute la même requête, tout se présente comme il se doit. Merci à tous pour l'aide.

+0

J'ai essayé cette requête dans Access 2000 et 2010 en utilisant les exemples de données et en réglant year et val comme entier long. Je n'ai pas d'erreur, seulement des zéros. – Fionnuala

Répondre

0

Je pense que le fait que a_table soit une requête peut avoir de l'importance (voir mon commentaire sur votre article).

0

Quelle version d'Access utilisez-vous? Cela pourrait être un autre bizarre bizarre/bug d'Access. La colonne Val est-elle non nulle? Peut-être qu'Access voit cela et rend les colonnes Val dans vos résultats non nulles, ce qui crée une erreur quand elles s'avèrent être nulles.

Peut-être vous voulez juste traiter avec une instruction conditionnelle pour cacher l'erreur:

SELECT a.ID, a.year AS [Year], iif(isnull(a.year),0,a.Val) AS VAL... 

Je pense que isnull est la bonne syntaxe pour l'accès, mais si ce n'est pas, vous obtenez l'idée.

+0

C'est Access 2000. Les instructions conditionnelles ne fonctionnent pas; J'ai essayé ça. [A_TABLE] est en fait une requête, mais cela ne devrait pas avoir d'importance; les erreurs apparaissent quand il n'y a rien à LEFT JOIN à ... Je vais éclaircir ces détails dans le message initial ... – user3930756

+0

Je pense que le fait que a_table soit une requête peut avoir de l'importance (voir mon commentaire sur votre message). Peut-être pourriez-vous poster le sql de la requête? – Fionnuala

+1

Oui, c'est ça. J'ai fait la requête dans une table et a couru ma requête initiale de cette nouvelle table et cela a bien fonctionné. Des réflexions sur pourquoi fonder une requête provoquerait cela?(c'est une sorte de requête compliquée) Si vous voulez, essayez de le mettre dans un nouveau commentaire afin que je puisse l'accepter comme réponse ... – user3930756

0

J'ai eu le même problème, sauf que je faisais une jointure très simple à gauche entre une table et une requête. Le champ auquel je participais était un entier long dans la table, mais il a été converti en utilisant CLng() dans la requête d'origine. La jointure gauche m'a donné le problème #Error. Changer la colonne de la table en texte et supprimer la conversion CLng() a résolu mon problème. Je ne connais pas assez les formats de données MS Access et les conversions pour savoir pourquoi cela était un problème. J'utilise Access 2003.