按行按列顺序返回的数据

时间:2013-11-04 23:31:03

标签: sql sql-server-2008-r2

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

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

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

任何人都可以帮我解决这个问题吗?我想我需要使用存储过程而不是视图...

谢谢, 戴夫

1 个答案:

答案 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