Как можно вернуть несколько столбцов в подзапросе столбца в Access 2003 JET SQL? - PullRequest
0 голосов
/ 08 декабря 2011

Я работаю над проектом, который ежедневно записывает показатели производительности сотрудников.

Таблица records содержит одну строку в день производительности сотрудников;В каждом столбце содержится количество элементов, выполненных в этой категории, а также общее время смены и дата в качестве краткой даты.

В таблице metrics содержится эффективная дата (короткая дата) и столбцы, соответствующие столбцам производительности.в таблице records, которая отслеживает ожидаемую часовую производительность.

Таблица employees просто содержит имена сотрудников и добавочные номера телефона.

В отчете сотрудника может быть задано значение переменнойдиапазоны дат для отображения производительности с течением времени, а GroupLevel(1).GroupOn также устанавливается через VBA (создает разделы по неделям, месяцам, кварталам и т. д.).

Цель здесь - создать запрос, который возвращает все строкитаблицы записей (которая впоследствии будет отфильтрована на основе whereCondition, переданного при открытии отчета) вместе со строкой таблицы metrics, которая является самой высокой датой, меньшей или равной records.date.До сих пор я смог получить только идентификатор (или любое другое отдельное поле) строки metrics:

SELECT records.*, employees.first, employees.last, employees.ext,  
   (
    SELECT TOP 1 metrics.id 
    FROM metrics 
    WHERE metrics.date<=records.date 
    ORDER BY metrics.date DESC
   ) AS MetricsID
FROM employees 
INNER JOIN records ON employees.id = records.employee
ORDER BY employees.last;

Я ищу способ написания этого запроса, поэтому яиметь все столбцы в каждой строке - когда я запускаю свою функцию вычисления во время GroupFooter2_Format, это означает, что мне не придется запрашивать metrics для каждой строки в диапазоне дат.

Бонусная благодарность, если вы можетеподскажите, как написать запрос, который будет автоматически делить столбец в records на соответствующий столбец в metrics, чтобы я мог просто заполнить поля напрямую.

1 Ответ

1 голос
/ 08 декабря 2011

Что-то из этих строк может подойти:

SELECT Records.*, Metrics.*, 
    Round([Records].[Productivity]/[Metrics].[ExpectedRate],2) AS Calc, 
    Employees.First, Employees.Last
FROM ((Records 
INNER JOIN 
    (SELECT records.ID, 
       (SELECT TOP 1 metrics.id 
        FROM metrics 
        WHERE metrics.date<=record.date 
        ORDER BY metrics.date DESC ) AS MetricsID 
     FROM records)  AS j 
ON Records.ID = j.ID) 
INNER JOIN Metrics ON j.MetricsID = Metrics.ID) 
INNER JOIN Employees ON Records.Employee = Employees.ID;

Однако я немного подозреваю, что представленные данные были упрощены, поскольку вы упоминаете «элементы, выполненные в этой категории», но не упоминаете идентификатор категории ни в таблице записей, ни в таблице метрик.

Кроме того, date - зарезервированное слово и, следовательно, ужасное имя почти для всего.

Очень редко хорошая идея выбирать *, вы должны использовать имена полей (столбцов).

...