如何运行此访问查询?

时间:2010-12-13 20:29:55

标签: sql database database-design ms-access

嘿伙计们我想在Access中运行这个查询/计算字段,这是我想做的事情:

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";
}

工资和许可证是表格,数据库中有另外两个表格 - 汽车和员工。

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.

基本上,许可证中的“乐队”字段需要根据工作人员的工资来计算......薪水必须与工作人员的详细信息分开,因此工资表......

有什么想法吗?

编辑:

回答答案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;

运行时“表达式中的类型不匹配”...

2 个答案:

答案 0 :(得分:4)

请参阅“交换机功能的访问”帮助主题。

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

“表达式从左到右进行计算,并返回与第一个表达式相关联的值以评估为True。”

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];

更新:我针对Salaries表构建并测试了Switch语句,其中Amount字段是数字数据类型。除非您的金额字段不是数字,否则我会检查您的FROM子句。此查询是否正常运行?

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;

答案 1 :(得分:2)

如果你想要一些不太硬编码的东西,你可以把乐队放在一个新的表中(列:id / name,lower,upper)。

最低的“下限”应该为零,每个后续的“下限”应该与之前的“上限”完全相同,最后的“上限”应该是一个巨大的数字,代表无限。

然后加入这样的东西:

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

如果salaries.amount可以为null,那么你将不得不使用左外连接并专门处理该情况。