2012-05-14 49 views
2

我想創建一個SQL查詢,它返回一個商業名稱。員工是團隊的成員,團隊,團隊和團體都是企業的成員。跨表準則查詢

我需要選擇具有僱員的業務,這些僱員是團隊的成員,它具有某些屬性作爲整體。

我該如何着手編寫SQL以將具有成員的業務返回到高級成員比率爲%?前團隊A在100名團隊成員中只有20名高級員工;所以它失敗了,應該返回A隊所屬的業務。

我知道我需要根據他們的團隊將員工分組在一起,但某種程度上需要計算對SENIOR = NO具有SENIOR = YES的員工並返回他們所屬的業務。想法?

它們是包含一些敏感信息的MS Access表,但你能想到的表爲被設置如下:

tblBusiness:BID,BNAME
tblTeam:TID,TNAME,TBusRef
tblEmployee: EID,EName,ETeamRef,EBusRef,ESenior

我已經從字面上嘗試了所有的SQL方式:我已經完成了從嵌套SQL到重聚合到包含count的表達式。最近的(我認爲)我已經得到的是:

SELECT tblBuisiness.BName FROM tblBuisiness 
GROUP BY BName HAVING (
COUNT(SELECT DISTINCT tblEmployee.ETeamRef FROM tblEmployee WHERE ESenior=-1) 
/
COUNT(SELECT DISTINCT tblEmployee.ETeamRef FROM tblEmployee) 
< 0.5 
) 

現在這一個可能有語法錯誤(是在剪貼板),但我通過它去了100倍,我得到的是「不能有agregate表達最接近「COUNT()/ < 0.5」「

如果Business1的TeamA有20位高級會員和80位普通會員,則此查詢將返回Business1。

+1

請出示您正在使用的表和所需的輸出的examlpe。 –

+0

請至少提供表格結構(列,樣本行)。優選地,還提供失敗查詢的至少一個示例以展示您正在做出的努力。 –

+0

剛纔在你的例子中注意到你使用'ESenior = -1';這是否意味着「-1」而不是「1」?我會認爲,如果一名員工是高級員工,那麼ESenior會是1,否則非高級員工的ESenior會等於0. –

回答

2

也許:

SELECT * 
FROM (
    SELECT 
    e.EBusRef, 
    Count(e.EID) AS EmpCount, 
    Sum(Abs([ESenior])) AS Senior, 
    [Senior]/([EmpCount]/100) AS [%Senior] 
    FROM tblEmployee AS e 
    GROUP BY e.EBusRef) q 
WHERE q.[%Senior]<=50 
+0

+1爲優雅 –

+0

始終學習新東西;不知道你可以將FROM參數作爲另一個列表;認爲這是一張桌子或什麼都沒有。 – StuckAtWork

+0

我認爲這已經解決了。這將需要更多的修補程序,以適應我的應用程序,但方法是可靠的。謝謝一堆!只要我可以,你會收到一個upvote .. = S – StuckAtWork

0

這樣的事情應該會給你百分之百。你只需要重新包裹,在SeniorPercentage字段進行篩選

select 
    B1.BName, 
    SeniorPercentage = ((select count(1) from tblEmployee E1 inner join tblTeam T1 where T1.TBusRef = B1.BID and E1.ESenior = 1)/(select count(1) from tblEmployee E2 inner join tblTeam T2 where T2.TBusRef = B1.BID)) 
From 
    tblBusiness B1 

PS我沒有寫的完全連接,但你可以很容易地添加英寸

+0

這是返回所有BNames而不僅僅是罪犯,並顯示一個「0」的百分比或「N/A」。 Access還要求我提供「SeniorPercentage」的價值。它正在做一些事情,但不是我想要的。 編輯:剛纔看到這是做什麼:這是要求一個百分比,並返回-1任何企業,完全符合百分比。我會盡量包裝它。 – StuckAtWork