【问题标题】:How to write this SQL query as per requirement如何根据要求编写此 SQL 查询
【发布时间】:2014-08-21 16:46:15
【问题描述】:

考虑以下公司数据库的架构(主键以粗体显示)。

Employee (**EmployeeID**, Name, Office, Email, Sex, Salary, DepartmentID)
Department (**DepartmentID**, DepartmentName)
Project (**ProjectID**, DepartmentID, Duration)
EmployeeProject (**EmployeeID, ProjectID**, WorkHours)

用SINGLE QUERY语句查找总工时第二长的项目。 尽量不要使用 top 或 limit。

以下是我的解决方案,它相当丑陋且效率低下。

select projectid
from (
    select projectid, sum(workhours) as hours
    from employeeproject ep
    group by projectid
) sum
where hours = (
    select max(hours)
    from (
        select projectid, hours
        from (
            select projectid, sum(workhours) as hours
            from employeeproject ep
            group by projectid
        ) sum
        where hours < (
            select max(hours)
            from (
                select projectid, sum(workhours) as hours
                from employeeproject ep
                group by projectid
            ) sum
        )
    ) sec
)

【问题讨论】:

  • 您尝试过哪些无效的解决方案?
  • 好像是作业或者面试题……
  • 格式化问题实际上并没有帮助。
  • 是的,这是一道考试题,但可以问对吧?还是不行?
  • 可以问...可以用伪答案吗?我尽量避免 where in () 逻辑,而是更喜欢加入子查询。创建一个按 projectID 获取小时总和的最大查询...将其连接到选择最大小时值的子查询。有一个 where 子句来过滤掉子查询为空的位置(有效地过滤掉最长的项目)......从中选择 max 以获得第二长。这是一些嵌套的子查询,但我会在 where in / where not in route 之前走那条路线

标签: sql database dml


【解决方案1】:

由于这似乎是一个家庭作业问题,因此根据网站政策提供了完整答案: https://meta.stackexchange.com/a/10812

不过,我们似乎可以为您指明正确的方向。 :)

尝试将问题分解为几个步骤:

  1. 找出每个项目的总工作时间 - 你已经完成了。
  2. 找出两个最长的项目 - 查看 TOPORDER BY 运算符。
  3. 找出这两个项目中最短的一个 - ORDER BY 可以按升序或降序工作。

那么如何将这些步骤组合到一个查询中应该是相当明显的。

【讨论】:

  • select projectid from ( select projectid, sum(workhours) as hours from employeeproject ep group by projectid order by sum(workhours) desc limit 2 ) sum order by hours limit 1
  • 我想这就是你的意思,它适用于我的测试数据。不知何故,根本没有教过顶或极限,所以我认为这不是预期的答案。
  • @David:我想这取决于你的老师是只接受一个特定的答案,还是会接受任何解决问题的答案。 :)
  • 是的,我想我需要相应地澄清这一点。谢谢。
【解决方案2】:

选择项目ID 来自员工项目 其中 WORKHOURS = (选择 MAX(WORKHOURS) 来自员工项目 工作时间

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-14
    • 2013-02-01
    • 2012-02-29
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多