我需要创建一个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")
答案 0 :(得分:1)
你是初学者,所以如果我向你展示一个prêt-à-porter查询,我认为这没什么用。相反,我会告诉你你的查询是做什么的。
您使用的是过时的连接语法。您可以使用显式关键字CROSS JOIN
替换表名之间的逗号。所以你的主要查询有:
FROM Agent, Policy, PolicyCover
转换为
FROM Agent CROSS JOIN Policy CROSS JOIN PolicyCover
并表示:从代理获取每条记录,并将它们与Policy中的每条记录合并,然后获取结果行,并将它们与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")
因此,您从代理商中选择薪水加上佣金的总和。然后从代理商中选择最低工资,当然低于所有工资(加佣金)的总和。所以这种情况从未得到满足。您不选择任何记录。
如果你有一个满足条件的WHERE
子句,你可以从无数的组合行中选择一些列加上一些溢价值。让我们看看那个子查询:你交叉加入Policy和PolicyCover,从而创建所有组合。在WHERE
中,您确保从Policy表中获取的AgentNo存在于Policy表中。嗯,当然这总是如此。
第一件事:学习正确的联接(INNER JOIN ... ON ...
开始)。考虑与表相关的内容并仅加入相关记录(例如,使用相同的策略编号)。
接下来的事情:养成在使用多个表时限定列的习惯。 Premium是例如Policy或PolicyCover的一列吗?通过指定表名{} SUM(PolicyCover.Premium)
来明确这一点。或使用表格别名:FROM PolicyCover pc
和SUM(pc.Premium)
。
答案 1 :(得分:0)
这不是很简单吗?
select (salary + commission) "sum of commission and salary"
from agent
where (salary + commission) < (select min(salary) from agent where function = 'Manager')