关于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将被选中。不,它是