2010-12-13 5 views
1

Hé les gars, je suis à la recherche d'exécuter ce champ de requête/calculée dans Access, voici ce que je veux faire:Comment lancer cette requête d'accès?

If(Salaries.Amount > 20000) { 
    If(Salaries.Amount > 30000) { 
     If(Salaries.Amount > 40000) { 
      Permits.Band = "Band 4"; 
     } Else { 
      Permits.Band = "Band 3"; 
     } 
    } Else { 
     Permits.Band = "Band 2"; 
    } 
} Else { 
    Permits.Band = "Band 1"; 
} 

Salaires et permis sont des tables, avec 2 autres tables de la DB - Cars et le personnel.

Salaries/Staff are linked by Staff_ID: 1 to 1, 
Staff/Permits are linked by Staff_ID: 1 to 1, 
Permits/Cars are linked by Permit_ID: 1 to M. 

Fondamentalement, le champ « bande » des permis doit être calculé en fonction du personnel salaire des membres ... Le salaire se doit d'être dans un tableau distinct des détails du personnel, d'où la table salaries ...

Des idées?

EDIT:

En réponse à la réponse 1:

SELECT Switch(Salaries.Amount > 40000, "Band 4", 
       Salaries.Amount > 30000, "Band 3", 
       Salaries.Amount > 20000, "Band 2", 
       True, "Band 1") AS Band 
FROM (Staff INNER JOIN (Permits INNER JOIN Cars ON Permits.Perm_ID = Cars.Perm_ID) ON Staff.Staff_ID = Permits.Staff_ID) INNER JOIN Salaries ON Staff.Staff_ID = Salaries.Staff_ID;

donne "non-concordance de type dans l'expression" lorsqu'il est exécuté ...

Répondre

4

Voir le sujet d'aide accès pour la fonction de commutation.

Switch (expr-1, valeur-1 [, expr-2, la valeur 2 ... [, expr-n, la valeur n]])

« Les expressions sont évaluées de gauche à à droite, et la valeur associée à la première expression à évaluer à True est renvoyée. "

SELECT Switch(Salaries.Amount > 40000, "Band 4", 
       Salaries.Amount > 30000, "Band 3", 
       Salaries.Amount > 20000, "Band 2", 
       True, "Band 1") AS band 
FROM [your tables expression]; 

Mise à jour: Je construit et testé l'instruction switch contre une table salaries où le champ Montant est un type de données numérique. À moins que votre champ Montant ne soit pas numérique, je vérifierais votre clause FROM. Cette requête s'exécute-t-elle sans erreur?

SELECT * 
FROM (Staff INNER JOIN (Permits INNER JOIN Cars 
    ON Permits.Perm_ID = Cars.Perm_ID) ON Staff.Staff_ID = Permits.Staff_ID) 
    INNER JOIN Salaries ON Staff.Staff_ID = Salaries.Staff_ID; 
+0

Merci! Cela modifie-t-il quelque chose comme ce qui est nécessaire? Merci –

+0

@Chris Je ne sais pas pourquoi vous obtenez "Type mismatch". Voir si ma mise à jour donne un indice. – HansUp

+0

Encore une fois lors de l'exécution de cette mise à jour ... :( –

2

Si vous voulez quelque chose d'un peu moins codé en dur, vous pouvez mettre les bandes dans une nouvelle table (colonnes: id/nom, inférieur, supérieur). Le plus bas "inférieur" doit être zéro, chaque "inférieur" suivant doit être exactement égal au précédent "supérieur", et le dernier "supérieur" doit être un nombre énorme pour représenter l'infini.

Alors rejoignez quelque chose comme ceci:

select whatever 
from salaries s 
inner join band b on b.lower <= s.amount and b.upper > s.amount 

Si salaries.amount peut être nul, alors vous devrez utiliser une jointure externe gauche et gérer ce cas particulier.