【问题标题】:How to get all the columns, but have to group by only 2 columns in sql query如何获取所有列,但必须在 sql 查询中仅按 2 列分组
【发布时间】:2013-03-24 23:11:24
【问题描述】:

我有一张表Employees,其字段如下:

Employee_name,Employee_id,Employee_status,Employee_loc,last_update_time.

此表没有任何约束。 我已经尝试了以下查询。

select Employee_name, count(1) 
from Employees 
where Employee_status = 'ACTIVE' 
Group by Employee_name,Employee_loc 
having count(Employee_name) > 1 
order by count(Employee_name)  desc

在选择中,我也需要获取Employee_id。任何人都可以帮助了解如何获取它吗?

【问题讨论】:

  • 如果有十个同名同址的员工,你想要哪个employee_id?你要全部10个吗?只是最小值(或最大值)?如果要全部 10 行,是否要返回 10 行?
  • 你能提供样本数据和所需的输出吗?
  • 我需要所有 10 个员工 ID。 (理想情况下,它将获得具有相同位置和名称且处于活动状态的员工列表。)
  • 谢谢贾斯汀,为我做了点什么。

标签: sql oracle


【解决方案1】:

您可以将Employee_id 添加到查询中,也可以将其添加到group by 子句中。 (将其添加到分组中不会对查询结果产生任何影响,假设每个员工姓名每个员工 id 都是唯一的)。

如果分组确实有所作为,这意味着员工姓名和位置的某些组合具有多个关联的 ID。因此,您的查询需要决定返回哪个 ID,可能使用聚合函数。

【讨论】:

  • 我不能,如果我在 group by 中也添加了employee_id,那么它试图找到所有三个字段的唯一组合(Employeed_name、Employee_loc、Employee_id)。我需要唯一的组合Employee_name 和 Employee_loc..
  • @Muthukumar,如果有所不同,这意味着employee_name, empolyee_loc 的某些组合有多个employee_id。那你怎么知道你想要哪个呢?
  • 我需要所有这些employee_ids.. 理想情况下,它将获得具有相同位置和名称且处于活动状态的员工列表
【解决方案2】:
SELECT EMPLOYEE_NAME, EMPLOYEE_ID, COUNT(1)
FROM
EMPLOYEES
WHERE
EMPLOYEE_NAME IN
(
SELECT EMPLOYEE_NAME
FROM EMPLOYEES
WHERE Employee_status = 'ACTIVE'
GROUP BY Employee_name,Employee_loc
HAVING COUNT(*) > 1
)
GROUP BY EMPLOYEE_NAME, EMPLOYEE_ID

【讨论】:

  • 太棒了……太酷了。现在对于每个 employee_name ,我有多行。我只需要在更新时间之前获得最新的吗?有可能得到吗?
  • 我们需要 Employee_status 在外部查询中,因为它再次拉动具有所有状态的员工..
【解决方案3】:

您还可以使用 partition by 子句并选择您想要查看的任何列,而不管您用于聚合的列。

这里有一个非常简短的解释 - Oracle "Partition By" Keyword

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-11
    • 2011-09-08
    • 2016-11-25
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多