2011-06-23 63 views
0

幾周前我問了一個類似的問題,但現在需求已經改變。計算認證經理的百分比

考慮下表: http://www.maroisconsulting.com/Temp/query.png

我需要創建一個返回的員工誰是經理(Titles.IsManager),誰擁有在認證領域(Employees.Certified)日期的百分比的查詢。結果需要由集團各店是分組

到目前爲止,我有這樣的:

 
SELECT d.GroupId, 
     Sum(d.cert_complete) AS SumOfcert_complete, 
     Count(d.cert_complete) AS CountOfcert_complete 
FROM (SELECT DISTINCT 
     s.GroupId, 
     e.EmployeeID, 
     IIf(e.Certified Is Null,0,1) AS cert_complete 
    FROM 
     ((Stores AS s 
     INNER JOIN EmployeeStores AS es ON s.StoreId = es.StoreId) 
     INNER JOIN Employees AS e ON es.EmployeeId = e.EmployeeID) 
     INNER JOIN Titles AS t ON e.TitleId = t.TitleId 
    ) AS d 
WHERE t.IsManager 
GROUP BY d.GroupId; 

然後將此

 
SELECT q.GroupId, 
     (SumOfcert_complete/CountOfcert_complete)*100 AS percent_certified, 
     Groups.GroupName 
FROM qryGroupCert_base AS q 
INNER JOIN Groups ON q.GroupId = Groups.GroupId; 

您可以在第一個查詢看到我添加標題表。

1)我得到提示輸入IsManager的,雖然我不知道爲什麼 2)回來的結果是不是比以前我加入了IsManager的

任何人都看看有什麼錯在這裏有什麼不同?

非常感謝

回答

0

在第一個查詢,你有這樣的子查詢,其中包括標題別名爲「T」:

(SELECT DISTINCT 
    s.GroupId, 
    e.EmployeeID, 
    IIf(e.Certified Is Null,0,1) AS cert_complete 
FROM 
    ((Stores AS s 
    INNER JOIN EmployeeStores AS es ON s.StoreId = es.StoreId) 
    INNER JOIN Employees AS e ON es.EmployeeId = e.EmployeeID) 
    INNER JOIN Titles AS t ON e.TitleId = t.TitleId 
) AS d 

然後,子查詢的定義,你有這樣的WHERE子句:

WHERE t.IsManager 

問題是「t」別名和IsManager列只存在於子查詢中 - >它們對於外部(父)查詢是未知的。如果Access數據庫引擎遇到某些它不能識別爲對象名稱,函數,字面值或SQL關鍵字的情況,它認爲某事必須是參數...因此彈出輸入框,要求您提供(IsManager)參數的值。

我想你應該在子查詢定義中移動WHERE子句。

SELECT d.GroupId, 
     Sum(d.cert_complete) AS SumOfcert_complete, 
     Count(d.cert_complete) AS CountOfcert_complete 
FROM [SELECT DISTINCT 
     s.GroupId, 
     e.EmployeeID, 
     IIf(e.Certified Is Null,0,1) AS cert_complete 
    FROM 
     ((Stores AS s 
     INNER JOIN EmployeeStores AS es ON s.StoreId = es.StoreId) 
     INNER JOIN Employees AS e ON es.EmployeeId = e.EmployeeID) 
     INNER JOIN Titles AS t ON e.TitleId = t.TitleId 
     WHERE t.IsManager = True 
    ]. AS d 
GROUP BY d.GroupId; 
+0

我認爲那樣做了。謝謝!!! – CoderForHire

0

也許你需要提供用於t.IsManager,如t.IsManager = TRUE一個標準。如果where子句沒有設置它的值,Access可能不會將其解析爲實際列,但認爲它是查詢參數。

+0

WHERE子句用於布爾字段,所以「WHERE IsManager」與「WHERE IsManager = 1」相同。問題是,即使添加了標題表並添加了WHERE子句,結果也不會從以前的版本更改。所以我不認爲查詢是尊重標題加入,但我不知道爲什麼 – CoderForHire

+0

你是不是指'WHERE IsManager = -1'?在Access/Jet/ACE/VBA中布爾TRUE的值是-1,而不是1.也就是說,雖然Access/Jet/ACE會理解你的布爾WHERE測試(我不知道,直到我測試響應這個問題),我仍然認爲你應該明確指定比較值,即'WHERE IsManager = True'。這很容易理解和閱讀。令我着迷的是,Access QBE網格的設計視圖表示網格的Criteria行中的'WHERE IsManager'爲<> False。 –