2011-12-08 61 views
0

我正在制定一個記錄員工日常績效指標的項目。如何在Access 2003 JET SQL的列子查詢中返回多個列?

records表保存每名員工生產力的日子一排;每一列都包含該類別中已完成項目的計數,加上總轉移時間和日期作爲短日期。

metrics表包含與records表中的生產力欄匹配的生效日期(短日期)和列,它們跟蹤預期的小時生產率。

employees表格只包含僱員的姓名和電話分機。

員工報告可以設置爲可變日期範圍以顯示一段時間的績效,並且GroupLevel(1).GroupOn也可以通過VBA設置(按周,月,季度等創建部分)。

這裏的目標是創建一個查詢,該查詢返回記錄表的所有行(稍後將根據打開報表時傳遞的whereCondition進行過濾)以及metrics表中最晚的日期行大於或等於records.date。到目前爲止,我只能夠得到metrics行的ID(或其他任何單一領域):

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

獎金的感激之情,如果你能告訴我如何編寫一個查詢,將在metrics對應一個自動將列在records,這樣我就可以直接填充字段。

回答

1

在這些線路上的東西可能適合:

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; 

不過,我有點懷疑是不是顯示的數據已簡化的,因爲你提到「該類別中完成的項目」,但沒有提到一個類別ID在記錄表或指標表中。

此外,date是保留字,因此幾乎所有的東西可怕的名字。

這是很少一個好主意,選擇*,你應該使用的字段(列)名。

+0

這看起來不錯,今天下午我有機會試試看。數據不會與類別類型一起存儲,每列都是它自己的類別。不是最好的做法,但它最初是匆匆修建的......去保存修復爲「2.0」 – 4AM

+0

這裏唯一的問題是Round()函數中的參數抱怨說「指定的字段'記錄。生產力'可以引用SQL語句的FROM子句中列出的多個表',但只要我具有相關度量標準,我就可以在VBA中進行計算,並且如果刪除計算字段,查詢就可以工作。 – 4AM

+0

嗯,似乎儘管查詢在數據表視圖中起作用,但任何試圖在報表控件中引用命名字段的嘗試都會導致與上面相同的錯誤 – 4AM