Как запустить этот запрос доступа? - PullRequest
1 голос
/ 13 декабря 2010

Эй, ребята, я хочу запустить это поле запроса / вычисления в 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.

По сути, поле "Группа" в разрешениях должно быть рассчитано в зависимости от зарплаты сотрудников ... Зарплата должна быть в отдельной таблице от данных о персонале, следовательно, таблица зарплат ...

Есть идеи?

EDIT:

В ответ на ответ 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 ]

4 голосов
/ 14 декабря 2010

См. Раздел справки Access для функции переключателя.

Переключатель (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];

Обновление : Я построил и протестировал оператор Switch для таблицы Salaries, где поле Amount является числовым типом данных.Если ваше поле 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;
2 голосов
/ 14 декабря 2010

Если вы хотите что-то менее жесткое, вы можете поместить полосы в новую таблицу (столбцы: 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 может быть нулевым, вам придется использовать внешнее левое соединение и обрабатывать этот случай специально.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...