用于从3个表中获取数据的SQL查询

时间:2015-11-15 21:40:34

标签: mysql sql

一个MySQL问题,为初学者道歉。我想从3个不同的表格中获取数据,您可以在附件screenshot中看到。

给定公司维护员工'旅行,但由于技术原因,在两个不同的表格中。有两种类型的旅行。如果员工选择第一个,则将其存储在第一个表中。此表中仅存储此类旅行。如果他选择第二个,它将与其他几种类型的工作时间一起存储在第二个表格中。 (这两种旅行类型之间的差异与税收有关,但这里没有兴趣。)我想生成一个3列结果集,显示今年每个人的旅行天数(见上面的截图) 。使用SUM或COUNT很困难,因为两个表中的数据结构完全不同。我尝试使用下面的SQL查询,但这只是联合两个不同的查询我想要合并的内容。我想在结果集中看到所有的员工,不管他们是否一直旅行。如果他们没有,我想在那里看到NULL值。

SELECT Employees.Name as name1, SUM(TravelType1.TravelDurationDays) as Travel FROM `Employees` INNER JOIN `TravelType1` ON Employees.EmployeeID=TravelType1.EmployeeID WHERE (TravelType1.StartTime>='01.01.2015' and TravelType1.EndTime<='31.12.2015') GROUP BY Employees.Name

UNION

SELECT Employees.Name as name1, COUNT(*) as Travel FROM `Employees` INNER JOIN `TravelType1` ON Employees.EmployeeID=TravelType2.EmployeeID WHERE TravelType2.TravelDay>='01.01.2015' and TravelType2.TravelDay<='31.12.2015' and TravelType2.Travel='yes' GROUP BY Employees.Name

由于两个源表中的数据格式完全不同,我不确定它在一个SQL语句中是否可行。我已经尝试了LEFT JOIN和RIGHT JOIN的一些组合,但还没有实现任何目标。

感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

这可以通过2个子选择来解决:

SELECT
   e.Name,
   (SELECT
      SUM(TravelDurationDays)
   FROM
      TravelType1
   WHERE
      EmployeeID = e.EmployeeID
   ) TravelType1Days,
   (SELECT
      COUNT(*)
   FROM
      TravelType2
   WHERE
      EmployeeID = e.EmployeeID AND
      Travel = 'yes'
   ) TravelType2Days
FROM
   Employees e

答案 1 :(得分:0)

我用连接实现。

SELECT e.Name, 
  SUM(TravelType1.TravelDurationDays), 
  SUM(IF(TravelType2.Travel = 'yes' and TravelType2.Day >= '01.01.2015' and TravelType2.Day <= '31.12.2015', 1, 0))
FROM Employees e 
  LEFT JOIN TravelType1 ON e.EmployeeID = TravelType1.EmployeeID
  LEFT JOIN TravelType2 ON e.EmployeeID = TravelType2.EmployeeID
GROUP BY e.EmployeeID;