我正在为一个更大的生产系统开发一个简单的时间表模块,需要向用户显示一个信息表。我有以下表格可供使用:
TimeRecords
ID
WorkerID
AssyLineID
Station
Sequence
NbrHours
DateSubmitted
Workers
ID
Name
AssyLines
Name
在数据输入期间,AssyLine为每个工人输入时间。给定的工作人员可以在一天中的两个或更多个不同的工作站上工作。 Sequence值是根据数据输入期间输入的名称顺序分配的。
现在我想以下列格式返回所有装配线和所有工人的数据:
ResultSet
Worker.ID
Worker.Name
AssyLine.Name - group returned rows by assembly line, in alphabetical order
Sequence - within each assembly line, group by sequence
NbrHours - total hours for worker for this assembly line, all stations
TotalHours - total hours for this worker across all assembly lines and stations
其他警告: 1)给定工人的行应按照装配线的顺序从组装线开始组合在一起,它们记录的时间最长。我计划将给定工作人员的所有条目合并为一行以显示给用户,如果将一个用户的所有行组合在一起,这将更容易。如果无法做到这一点,我将不得不在代码中对行数据进行分组和排序......
这是我到目前为止提出的查询:
SELECT
w.ID
,w.Name
,a.Name
,tr.NbrHours
,tr.Seq
FROM
TimeRecords tr
INNER JOIN
Workers w ON
w.ID = tr.WorkerId
INNER JOIN
AssyLines a ON
a.AssyLineID = tr.AssyLineId
WHERE
tr.DateSubmitted < '2000-01-01'
ORDER BY
w.Name
,a.Name
,tr.Seq
,NbrHours DESC
显然,这还有很多不足之处。工作人员条目未组合在一起,并且工作人员没有总计。
任何人都可以帮我解决这个问题吗?我想我需要使用存储过程而不是视图...
谢谢, 戴夫
答案 0 :(得分:1)
大多数情况可以通过简单的group by子句来完成;凌乱的部分伴随着你显示所有时间的要求,但我相信这样的事情应该取决于你正在使用的数据库:
SELECT
w.ID
,w.Name
,a.Name
,tr.Seq
,SUM(tr.NbrHours) as nbrHours
(SELECT SUM(tr.NbrHours)
FROM TimeRecords tr2
WHERE tr2.WorkerId = w.id and tr2..DateSubmitted < '2000-01-01') as TotalHours
FROM
TimeRecords tr
INNER JOIN
Workers w ON
w.ID = tr.WorkerId
INNER JOIN
AssyLines a ON
a.AssyLineID = tr.AssyLineId
WHERE
tr.DateSubmitted < '2000-01-01'
GROUP BY
w.ID
,w.Name
,a.Name
,tr.Seq
ORDER BY
ReportName
,ShortName
,tr.Seq