[英]SQL Server Selecting data from different tables
我正在尝试为由其他表格中的数据组成的报表制作表格。 “报告”表需要包含每个站点需要多少假期和病假时间,但员工要分别花费几个小时的信息。 所有这些表都是通过外键关系连接的。
[dbo]。[员工]:
EmployeeID |Name |SiteID |
------------+----------------+---------------+
1 | Joe |1 |
2 | Tom |2 |
3 | Mary |3 |
4 | Bill |1 |
5 | 16 |2 |
现场:
[dbo]。[网站]:
SiteID |Site Name |
------------+----------------+
1 | SiteA |
2 | SiteB |
3 | SiteC |
[dbo]。[HolidayRequestForm]:
EmployeeID |HolidayHours |
------------+----------------+
1 | 8 |
2 | 16 |
3 | 16 |
[dbo]。[SickLeaveRequestForm]:
EmployeeID |SickHours |
------------+----------------+
1 | 8 |
2 | 8 |
3 | 8 |
我试图通过使用联接,然后从不同的表中选择相关数据来实现这一点,但是我没有运气。
SELECT *
FROM [dbo].[Employee]
INNER JOIN [dbo].[Site]
ON [dbo].[Site].SiteID = [dbo].[Employee].SiteID
INNER JOIN [dbo].[HolidayRequestForm]
LEFT JOIN [dbo].[SickLeaveRequestForm]
ON [dbo].[SickLeaveRequestForm].EmployeeID = [dbo].
[HolidayRequestForm].EmployeeID
GROUP BY [dbo].[Site].SiteName
创建视图会更好吗?
这是期望的结果!
SiteName |Holiday Hours |Sick Hours
---------+----------------+---------------+
Site A | 8 |8 |
Site B | 16 |8 |
Site C | 16 |8 |
SELECT dbo.Site.SiteName,
SUM(dbo.HolidayRequestForm.HolidayHours) AS HolidayHours,
SUM(dbo.SickLeaveRequestForm.SickHours) AS SickHours
FROM dbo.Employee INNER JOIN
dbo.Site ON dbo.Employee.SiteID = dbo.Site.SiteID INNER JOIN
dbo.HolidayRequestForm ON dbo.Employee.EmployeeID =
dbo.HolidayRequestForm.EmployeeID INNER JOIN
dbo.SickLeaveRequestForm ON dbo.Employee.EmployeeID = dbo.SickLeaveRequestForm.EmployeeID
GROUP BY dbo.Site.SiteName
创建视图会更好吗? 这完全取决于这是一次查询还是要定期使用该报告进行报告。
另外,如果要包括所有没有员工请病假或休假的站点(例如,对于MSSQL):
SELECT dbo.Site.SiteName,
{ fn IFNULL(SUM(dbo.HolidayRequestForm.HolidayHours), 0) } AS HolidayHours,
{ fn IFNULL(SUM(dbo.SickLeaveRequestForm.SickHours), 0) } AS SickHours
FROM dbo.Employee
LEFT OUTER JOIN dbo.HolidayRequestForm ON dbo.Employee.EmployeeID = dbo.HolidayRequestForm.EmployeeID
LEFT OUTER JOIN dbo.SickLeaveRequestForm ON dbo.Employee.EmployeeID = dbo.SickLeaveRequestForm.EmployeeID
RIGHT OUTER JOIN dbo.Site ON dbo.Employee.SiteID = dbo.Site.SiteID
GROUP BY dbo.Site.SiteName
您可以将SUM
聚合函数与GROUP BY
结合使用,如下所示。
SELECT s.sitename,
Sum(hf.holidayhours) AS HolidayHours,
Sum(sl.sickhours) AS SickHours
FROM [dbo].[site] s
INNER JOIN [dbo].[employee] e
ON s.siteid = e.siteid
INNER JOIN [dbo].[holidayrequestform] hf
ON e.employeeid = hf.employeeid
INNER JOIN [dbo].[sickleaverequestform] sl
ON sl.employeeid = e.employeeid
GROUP BY s.sitename
注意事项 :
*
不与GROUP BY
一起使用,您要在select中选择的任何非聚合列都应出现在GROUP BY
您正在尝试从正在分组的查询中选择所有列-您只能选择已分组或出现在聚合函数中的列:
SELECT s.SiteName, SUM(hrf.HolidayHours) as SumHolidayHours, SUM(slrf.SickHours) as SumSickHours
FROM
[dbo].[Employee] e
INNER JOIN [dbo].[Site] s
ON s.SiteID = e.SiteID
LEFT JOIN [dbo].[HolidayRequestForm] hrf
ON hrf.EmployeeId = e.EmployeeID
LEFT JOIN [dbo].[SickLeaveRequestForm] slrf
ON slrf.EmployeeID = e.EmployeeID
GROUP BY s.SiteName
您缺少其中一个联接的ON条件。 我还添加了表别名以减少视觉混乱,以防万一员工在这些表中没有任何记录的情况下,将两个联接都转换为小时表
有关对查询进行分组的重要一点是,分组列(您的站点名称)中具有相同值组合的多个记录将在输出中折叠为单个记录。 汇总函数(SUM MAX MIN AVG等)定义了折叠后所有详细数据的处理方式。 在这种情况下,我们尝试按站点总计时间。 该协会是
site -> employees -> hours (sick and holiday)
因为有多个员工,而且可能还有多个小时,但是我们将站点名称分组,所以输出中每个站点只有一行,因此我们需要指定一个汇总以在其他列上进行。 您无法从分组查询中选择*,因为您无法包含所有列; 您只能包括属于分组组合的一部分的列,或者属于该组的数据的总和。 如果您想向组查询中添加更多列,但又不想将组分解为有关分组键的更多详细信息,则必须将分组数据重新加入主表以获取其他数据数据
您可以尝试以下查询。
create table Employee(EmployeeID int, Name varchar(20), SiteID int)
insert into Employee values
(1, 'Joe', 1),
(2, 'Tom', 2),
(3, 'Mary', 3),
(4, 'Bill', 1),
(5, '16', 2)
create table [Site] (SiteID int, [Site Name] Varchar(20))
insert into [Site] Values
(1, 'SiteA'),
(2, 'SiteB'),
(3, 'SiteC')
Create table HolidayRequestForm(EmployeeID int, HolidayHours int)
insert into HolidayRequestForm Values
(1, 8),
(2, 16),
(3, 16)
Create table SickLeaveRequestForm(EmployeeID int, SickHours int)
insert into SickLeaveRequestForm Values
(1 ,8),
(2,8),
(3,8)
Select [Site Name], SUM(HolidayHours) as HolidayHours, SUM(SickHours) as
SickHours
from(
Select
[Site].[Site Name], HolidayRequestForm.HolidayHours, SickLeaveRequestForm.SickHours
from [Site]
inner join Employee on [Site].SiteId = Employee.SiteId
inner join HolidayRequestForm on HolidayRequestForm.EmployeeID = Employee.EmployeeID
inner join SickLeaveRequestForm on Employee.EmployeeID = SickLeaveRequestForm.EmployeeID
)a group by [Site Name]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.