0

我正在为大型生产系统开发一个简单的时间表模块,并且需要向用户显示信息表。我有以下表格可供使用:

TimeRecords
  ID
  WorkerID
  AssyLineID
  Station
  Sequence
  NbrHours
  DateSubmitted

Workers
  ID
  Name

AssyLines
  Name

在数据输入期间,AssyLine 为每个工人输入时间。一个给定的工人在一天中可能在 2 个或更多不同的工作站工作。序列值是根据在数据输入期间输入的名称顺序分配的。

现在我想以下列格式返回所有装配线和所有工人的数据:

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

显然,这还有很多不足之处。工作人员条目没有组合在一起,并且没有工作人员的总体总数。

谁能帮我解决这个问题?我想我需要用存储过程而不是视图来做到这一点......

谢谢,戴夫

4

1 回答 1

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
于 2013-11-05T05:36:03.803 回答