SQL查询困境

时间:2017-04-18 19:12:34

标签: 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")

2 个答案:

答案 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 pcSUM(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')