2017-04-18 73 views
0

我需要创建一个SQL查询,从小于最低收益经理SQL查询困境

这里的薪水的代理检索提成和工资的总和我的查询到目前为止,我收到一个空白表:

SELECT AgentName, 
     Salary, 
     Commission, 
     (SELECT sum(Premium) 
     From Policy,PolicyCover 
     WHERE AgentNo IN (Select AgentNo From Policy)) As [Total Premium] 
FROM Agent,Policy,PolicyCover 
WHERE (Select sum(Salary+Commission) 
     From Agent) < 
     (Select Min(Salary) 
     From 
     Agent Where Function= "Manager") 
+7

请发布这些数据库表的结构 – gaganshera

+2

首先不要使用逗号分隔的连接。你似乎是一个初学者,所以谁教你使用在1992年**中被重复使用的连接语法?然后你一次又一次从相同的表格中选择。您的子查询甚至与主查询没有关系。 –

+1

您被要求显示表格结构。请这样做。什么专栏属于哪个表?什么是表的主键? (顺便说一下:请添加MS Access标签,我不能因为有待编辑,请不要在没有标记DBMS的情况下询问SQL问题。) –

回答

0

难道这不简单吗?

select (salary + commission) "sum of commission and salary" 
from agent 
where (salary + commission) < (select min(salary) from agent where function = 'Manager') 
+0

否我不允许将薪水+佣金作为表中的属性添加 –

1

你是初学者,所以我觉得如果我向你展示一个prêt-à-porter查询,那么它就没有多大的帮助。相反,我会告诉你你的查询做了什么。

您正在使用过时的连接语法。您可以用显式关键字CROSS JOIN替换表名之间的逗号。所以,你的主查询有:

FROM Agent, Policy, PolicyCover 

它转换为

FROM Agent CROSS JOIN Policy CROSS JOIN PolicyCover 

和手段:从代理抓住每一个记录,并从政策的每条记录将它们结合起来,然后把结果行,并与每一个将它们结合起来记录在PolicyCover中。假设代理有100条记录,策略200和PolicyCover 300.这使得100 x 200 x 300组合= 6,000,000行。

我们的WHERE条款:

WHERE (Select sum(Salary+Commission) From Agent) < 
     (Select Min(Salary) From Agent Where Function = "Manager") 

所以,你选择工资加commison从代理的总和。然后你从代理商中选择最低工资,这当然低于所有工资总额(加上佣金)。所以病情从未得到满足。您不选择记录。

如果您有条件满足的WHERE子句,您将从无数行组合行中选择一些列加上一定数量的溢价值。让我们看看这个子查询:你交叉加入Policy和PolicyCover,从而创建所有组合。在WHERE中,确保您从Policy表中获得的AgentNo存在于策略表中。那么,这当然是真的。

第一件事:学习正确的连接(INNER JOIN ... ON ...开始)。考虑与表相关的内容,并只加入相关记录(例如,使用相同的保单号)。

接下来的事情:在处理多个表格时,使其符合您的列的使用习惯。例如Premium是Policy还是PolicyCover?通过指定表名来明确这一点:SUM(PolicyCover.Premium)。或者使用表别名:FROM PolicyCover pcSUM(pc.Premium)

+0

我试过使用交叉连接方法,它不起作用 –

+0

“不工作”说什么都没有。你是说当你用FROM Agent CROSS JOIN Policy CROSS JOIN PolicyCover代替'FROM Agent,Policy,PolicyCover'时,你会得到一个语法错误? –

+0

是的。我们被告知使用Microsoft Office Access的方式 –