【问题标题】:How do I write an SQL query to get the below output [closed]如何编写 SQL 查询以获得以下输出 [关闭]
【发布时间】:2021-09-06 16:22:23
【问题描述】:

如果我的表中的“经理”列对于部门的任何条目有一个条目“y”,我需要编写一个查询以获取输出中“经理名称”中“名称”列中的值。

表:

emp_id Name Dept Manager
1 a aa n
2 b aa n
3 c aa y
4 d aa n
5 e bb n
6 f bb y
7 g bb n

输出:

emp_id Name Dept Manager_name
1 a aa c
2 b aa c
3 c aa c
4 d aa c
5 e bb f
6 f bb f
7 g bb f

【问题讨论】:

  • 您的问题不清楚。为什么n 被“翻译”成cyf
  • 您是否正在寻找适用于 MySQL 或 PostgreSQL 的查询?你都尝试了些什么?你被困在哪里了?
  • 每个部门是否严格规定一名经理?除了不安全的客户端逻辑。

标签: mysql sql postgresql


【解决方案1】:

您可以使用窗口函数或连接子查询。

select emp_id, name, dept, manager_name
from table 
natural join (
   select dept, name manager_name 
   from table where manager = 'y'
) man_table

select 
  emp_id
, name
, dept
, first_value(name) over (partition by dept order by manager = 'y' desc) manager_name
from table

【讨论】:

    【解决方案2】:

    根据数据,我们很容易相信以下说法是正确的:

    1. 每个 Emp_id 都分配给唯一的个人
    2. 每个员工都在一个独特的部门工作
    3. 每个部门都有一个独特的经理

    对于所需的输出,我们可以保留表的前 3 列,并在其中提取经理名称创建一个新列。为此,我们需要一个具有 Dept 和 Manager 名称映射的表。 我们可以使用以下代码轻松获得:

    Select Dept, Name as Manager_Name from table_name where Manager = 'y'
    

    在主表中,如果我们过滤 Manager = 'y',Name 列将包含经理的姓名。这是我们需要应用的唯一逻辑。

    现在我们需要做的就是在现有表上左连接这个新表。请注意,我们不需要创建新表,它可以简单地嵌套在查询中。 详细代码如下所示:

    Select A.emp_id, A.Name, A.Dept, B.Manager_Name
    from 
    table_name A
    left join
    (
    Select Dept, Name as Manager_Name 
    from table_name where Manager = 'y'
    ) B
    on A.Dept=B.Dept
    ;
    

    【讨论】:

    • 请在您的答案中添加一些解释,以便其他人可以从中学习
    【解决方案3】:
    SELECT t1.*, t2.name manager_name
    FROM table t1
    JOIN table t2 USING (dept)
    WHERE t2.manager = 'y'
    

    PS。我看不到每个部门严格存在一个经理行的保证。如果没有这样的行或存在不止一个这样的行,则输出将不正确。

    PPS。如果这样的行可能不存在,请使用 LEFT JOIN。

    【讨论】:

      猜你喜欢
      • 2022-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-04
      • 1970-01-01
      • 2013-08-31
      • 2021-11-07
      • 1970-01-01
      相关资源
      最近更新 更多