关于SQL group by和having的访谈问题
这个问题来自以下方面 假设我们有两个表:关于SQL group by和having的访谈问题,sql,group-by,having,having-clause,Sql,Group By,Having,Having Clause,这个问题来自以下方面 假设我们有两个表: Salesperson ID Name Age Salary Orders Number order_date cust_id salesperson_id Amount 问题如下: 我们希望从上表中检索订单超过1张的所有销售人员的姓名。你可以假设每个销售人员只有一个ID。我可能也会假设所有的名字都是不同的 我的回答是这样的 select Name from salesperson S inner join Orders O
Salesperson
ID Name Age Salary
Orders
Number order_date cust_id salesperson_id Amount
问题如下:
我们希望从上表中检索订单超过1张的所有销售人员的姓名。你可以假设每个销售人员只有一个ID。我可能也会假设所有的名字都是不同的
我的回答是这样的
select Name from
salesperson S inner join Orders O
on S.ID=O.salesperson_id
group by Name
having count(number) >=2
然而,给出的答案如下:
SELECT Name
FROM Orders inner join Salesperson
On Orders.salesperson_id = Salesperson.ID
GROUP BY salesperson_id, NAME
Having count(salesperson_id) > 1
如果名称和salesperson_id是一对一,我们是否有理由在此处通过语句将salesperson_id添加到组中?另外,如果名称和销售人员id的关系只是一对一,那么如果我们按销售人员id、名称分组,计数(销售人员id)不总是1吗
我对此有点困惑,我想知道以前是否有人遇到过这个问题,并且觉得这很奇怪 除了
GROUP BY
子句之外,您的解决方案和接受的解决方案在功能上是相同的
被接受的解决方案通过Name
和salesperson\u id
进行聚合的可能原因是两个或多个销售人员碰巧同名。如果出现这种情况,您的查询将只报告一个名称,但会包含来自多个销售人员的聚合结果。但是,salessorn\u id
和Name
的组合应该总是唯一的
除此之外,我实际上更喜欢您的版本,我会从
salesperson
表加入到Orders
表。除了GROUP BY
子句之外,您的解决方案和公认的解决方案在功能上是相同的
被接受的解决方案通过Name
和salesperson\u id
进行聚合的可能原因是两个或多个销售人员碰巧同名。如果出现这种情况,您的查询将只报告一个名称,但会包含来自多个销售人员的聚合结果。但是,salessorn\u id
和Name
的组合应该总是唯一的
除此之外,我实际上更喜欢您的版本,我会从
salessorn
表加入到Orders
表。两个查询输出相同的结果。将salessorn\u id
放在groupby
子句中的唯一原因是您是否希望它也放在select
中。@rad我不同意<代码>销售人员id很可能被添加到组中,以处理两名销售人员碰巧同名的可能性。I@TimBeigeleisen OP假设所有名称也是唯一的。因此,两个group by
子句之间没有区别。您可以假设每个销售人员只有一个ID,但没有姓名,正如Tim所说,姓名和ID的组合使其唯一,因此我们需要在group by子句中同时使用这两个ID。但是计数(销售人员ID)呢?它不总是1吗?两个查询输出相同的结果。将salessorn\u id
放在groupby
子句中的唯一原因是您是否希望它也放在select
中。@rad我不同意<代码>销售人员id
很可能被添加到组中,以处理两名销售人员碰巧同名的可能性。I@TimBeigeleisen OP假设所有名称也是唯一的。因此,两个group by
子句之间没有区别。您可以假设每个销售人员只有一个ID,但没有姓名,正如Tim所说,姓名和ID的组合使其唯一,因此我们需要在group by子句中同时使用这两个ID。但是计数(销售人员ID)呢?不是一直都是1吗?我最大的抱怨是贴出的答案是,如果一对(姓名、销售人员id)有超过1个订单号怎么办?如果我们按姓名、销售人员id应用分组,并按计数(销售人员id)>1进行筛选,那么我认为我们将错过这些案例。这就是为什么我认为我的答案是正确的,而不是发布的内容。@user98235我想你可能会对拥有的工作原理感到困惑,而且你的逻辑也没有问题。COUNT
函数将任何非NULL
值计数为1。所以,你的逻辑只是说给我所有销售人员2个或更多订单;这是正确的。我考虑以下情况:假设我们有两行(Jim,1,10),(Jim,1,12),这只是名称、SalesorSoId和ordernumber的三元组。Jim显然有多个订单,但如果我们按名称从表组中选择name、salersonid,salersonid的count(salersonid)>1,那么count(salersonid)=1对Jim来说是不是?但是,如果我们的计数(odernumber)>1,那么将选择Jim。否,它将为Jim分配一个计数2。同样,COUNT
只计算非NULL
值,它对您要求它计算的列背后的业务逻辑一无所知。我最大的抱怨是发布的答案是,如果(姓名、销售人员id)对有超过1个订单号怎么办?如果我们按姓名、销售人员id应用分组,并按计数(销售人员id)>1进行筛选,那么我认为我们将错过这些案例。这就是为什么我认为我的答案是正确的,而不是发布的内容。@user98235我想你可能会对拥有的工作原理感到困惑,而且你的逻辑也没有问题。COUNT
函数将任何非NULL
值计数为1。所以,你的逻辑只是说给我所有销售人员2个或更多订单;这是正确的。我考虑以下情况:假设我们有两行(Jim,1,10),(Jim,1,12),这只是名称、SalesorSoId和ordernumber的三元组。Jim显然有多个订单,但如果我们按名称从表组中选择name、salersonid,salersonid的count(salersonid)>1,那么count(salersonid)=1对Jim来说是不是?但是,如果我们的计数(odernumber)>1,那么Jim将被选中。不,它是