2012-05-14 25 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