一个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的一些组合,但还没有实现任何目标。
感谢任何帮助,谢谢!
答案 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;