【问题标题】:Write a join query for get Project information编写连接查询以获取项目信息
【发布时间】:2018-03-08 19:56:01
【问题描述】:

我需要编写一个连接查询来获取项目详细信息(如下图)。我的要求是项目经理需要为他分配的特定项目获取developer,WorkingHours,overtime 的列表。我的数据库表结构如下。我可以使用这种结构实现我的要求吗?还是需要对表这个结构做些改动?

CREATE TABLE Developer (
    DeveloperID int NOT NULL IDENTITY,
    Name varchar(255),
    Email varchar(255),
    Mobile varchar(255),
    Primary key(DeveloperID)
);

CREATE TABLE Manager (
    ManagerID int NOT NULL IDENTITY,
    Name varchar(255),
    Email varchar(255),
    Mobile varchar(255),
    Primary key(ManagerID)
);

这是我的要求,我可以使用SQL Server 使用这个表结构得到这个输出吗?如果是,如何?

【问题讨论】:

  • @a_horse_with_no_name 抱歉我忘记加了,SQLServer请帮我解决这个问题

标签: sql-server join foreign-keys


【解决方案1】:

这应该适用于大多数 DBMS:

SELECT m.Name manager,
    p.Name project,
    d.Name developer,
    t1.allhours,
    t1.allovertime,
    100.0 * (t1.allhours + t1.allovertime) / t2.totalhours contribution
FROM Project p
LEFT JOIN Manager m ON m.ManagerID = p.ManagerID
LEFT JOIN (
    SELECT dp.DeveloperID, dp.ProjectID, SUM(dp.WorkingHours) allhours, SUM(dp.Overtime) allovertime
    FROM DevProj dp
    GROUP BY dp.DeveloperID, dp.ProjectID
) t1 ON t1.ProjectID = p.ProjectID
LEFT JOIN Developer d ON d.DeveloperID = t1.DeveloperID
LEFT JOIN (
    SELECT dp2.ProjectID, SUM(dp2.WorkingHours + dp2.Overtime) totalhours
    FROM DevProj dp2
    GROUP BY dp2.ProjectID
) t2 ON t2.ProjectID = p.ProjectID
WHERE m.Name = 'Manager A'
ORDER BY p.Name;

这会返回一个类似Manager | Project | Developer | Hours | Overtime | Contribution 的表。所有项目中的每个开发人员都占一行。

【讨论】:

  • 贡献与什么有关?我假设的 DevProj?它是一个字符串,您想为每个开发人员“汇总”(连接)吗?是Descriptions 专栏吗?
  • 我更新了我的答案。注意:此 SQL 未经测试,因为我没有 SQL 服务器实例来运行它。如果第二个子查询失败尝试SUM(dp2.WorkingHours) + SUM(dp2.Overtime)
  • 它应该适用于100.0 * (t1.allhours + t1.allovertime) / t2.totalhours contribution。可能是由于数据类型和舍入
  • 我认为您不需要更改任何内容。它运行在sqlfiddle.com/#!9/0b26d6/2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-03
相关资源
最近更新 更多