【问题标题】:Return duplicate row as one SQL将重复行作为一个 SQL 返回
【发布时间】:2021-06-13 12:06:03
【问题描述】:

我开始学习 SQL,发现了几个我想解决的练习题。您可以在下面的图片中查看问题。

据我所知,ID 为 2“Lloyd”的员工表重复了 2 次,您也可以在表付款中看到。 现在我想对这两条记录求和并显示为一个结果。 到目前为止我做了什么

SELECT p.Amount,
        e.Name  
 FROM Employee e 
 INNER JOIN Payments p
 ON e.EmployeeId = p.Id

到目前为止我得到的输出结果

1000    Daniel
2000    Lloyd
300     Patrick
1400    Lloyd

所以员工“劳埃德”重复了 2 次,我想将这两个结果相加为一 (2000+1400) = 3400。 谁能指导我并告诉我如何解决这个问题,我会非常感激?

更新

SELECT p.Amount,
        e.Name  
 FROM Employee e 
 LEFT JOIN Payments p
 ON e.EmployeeId = p.Id
 GROUP BY e.Name    

【问题讨论】:

  • 提示:GROUP BYLEFT JOIN.
  • 在您编写的查询中,尝试使用 group by 和 join。另一种解决方案是使用 PARTITION Syntax 。如果您无法解决,请在下方评论,我将添加确切的查询
  • @InderPreet 当我使用 LEFT JOIN 和 GroupBy 时出现错误。我更新我的问题。请看一下。这是我收到的错误消息Msg 8120, Level 16, State 1, Line 5 Column 'Payments.Amount' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
  • 但是为什么有 Lloyd 2 empoyee_ids 呢?
  • @nbk 我真的不知道。我从 InterviewProcess 中找到了这个问题,我认为这是一个棘手的问题。

标签: sql sql-server database


【解决方案1】:

您需要在您的案例 SUM 中添加一个聚合函数

SELECT SUM(p.Amount),
        e.Name  
 FROM Employee e 
 LEFT JOIN Payments p
 ON e.EmployeeId = p.Id
 GROUP BY e.Name    

正如安东尼所说。

更好的解决方案是

SELECT SUM(p.Amount),
       e.EmployeeId,
       e.Name  
 FROM Employee e 
 LEFT JOIN Payments p
 ON e.EmployeeId = p.Id
 GROUP BY e.EmployeeId,e.Name   

因为两个劳埃德可能是不同的人,所以他们的薪水必须在不同的账户中汇总

【讨论】:

  • 你也应该按 id 分组。如果名称不是唯一的,您可以将不同的人组合在一起。
  • @AntonínLejsek 在我的评论中我问了很多,但在问题中他想要 3400 所以没有 GROUP BY ID
  • OP 显然很困惑,他在员工 id 上加入支付 id 的事实表明他不知道自己在做什么。我只是想指出,当两个人碰巧同名时,并不意味着他们不是同一个人。
  • @AntonínLejsek 请阅读他从某个地方复制的问题,并想要 Lloydm 的总和,我的评论中提到的 diffret id 根本不介意他,所以为了这个问题,不需要 GROUP By id
【解决方案2】:

首先,你应该清楚你在看什么。每个表都有一个 id,它唯一地标识每一行。对于Employee 表,它是EmployeeId 列,对于Payments 表,它只是Id 列。在Payments 表中还有另一列EmployeeId 表示付款的对象。例如,奖金支付给 id 为 1 的员工,即 Daniel。您应该连接此列上的两个表。还有一件事,有两个不同的人碰巧有同一个名字——劳埃德。这样的事情在现实生活中确实会发生。他们有不同的EmployeeId,所以他们是不同的。你可以加入和分组表,你会得到

SELECT e.Name, SUM(p.Amount) as SumAmount
FROM Employee e 
LEFT OUTER JOIN Payments p
ON e.EmployeeId = p.EmployeeId
GROUP BY e.EmployeeId, e.Name

但假设员工有 20 列。您必须按 20 列分组。事实上,没有必要这样做。做你需要的,计算每个人的总和

SELECT 
  e.Name,
  (SELECT SUM(p.Amount) 
   FROM Payments p 
   WHERE p.EmployeeId = e.EmployeeId
  ) as SumAmount
FROM Employee e

【讨论】:

    【解决方案3】:
    select e.Name, Sum(p.Amount) from Employee e inner join Payment p on
    e.EmployeeId = p.EmployeeId group by e.Name
    

    这应该适合你。 我使用内部联接仅展示那些在支付表中有数据的记录。我已经根据名称对数据集进行分组,并使用聚合函数来展示金额

    【讨论】:

      猜你喜欢
      • 2020-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-06
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多