1

我是一家小型制造公司的首席技术官,显然做了一些非常实际的事情,并且感谢那里的专家为经验不足的人提供时间。

我正在尝试为 SQL Server 构建一个查询,以汇总制造过程中每台机器的时间。

我得到的结果看起来像:

InvoiceID Min DateIn      MachineName  MachineID
17993     12  2012-09-28  Beam Saw     1
17993     26  2012-09-28  Beam Saw     1
17993     17  2012-10-02  Edge Banding 3
17993     21  2012-10-02  Skipper      4
17993     23  2012-10-03  Shipping     5

等下一张发票。

我的代码:

SELECT i.InvoiceID
    ,SUM(DATEPART(Minute,(wf.DateTimeOut - wf.DateTimeIn))) AS [Min]
    ,CAST(wf.DateTimeIn AS DATE) AS [DateIn]
    ,m.MachineName
    ,wf.MachineID
FROM Workflow wf 
    JOIN
        InvoicesPerJobPeriod ipjp
        ON
        ipjp.Workflowid = wf.ID
    JOIN Machines m
        ON 
        m.MachineID = wf.MachineID
    JOIN
        Invoices i
        ON ipjp.InvoiceID = i.InvoiceID
WHERE (i.InActive = '0') 
GROUP BY i.InvoiceID, m.MachineName, wf.MachineID, wf.DateTimeIn
ORDER BY i.InvoiceID, wf.MachineID

我不明白为什么分组显示了 Beam Saw 的多个记录。理想情况下,每台机器、每张发票应该有一个记录。Datetimein 通常是同一天,但我需要显示它,以防制造步骤跨越数天。在那种情况下,我会合理地为一台机器拥有多个记录。

非常感谢你的帮助。非常感谢。

悬崖

4

1 回答 1

1

如果wf.DateTimeIn两个不同的 Beam Saw 记录完全不同(在日期或时间部分),它们将在GROUP BY子句中生成单独的行,即使您在SELECT语句中的非聚合使用仅指日期部分。

如果你想要的只是按日期部分分组DateTimeIn,你应该这样写:

GROUP BY i.InvoiceID, m.MachineName, wf.MachineID, CAST(wf.DateTimeIn AS DATE)

这将确保在其他方面匹配并在同一日期输入的任意数量的 Beam Saw 记录将被组合到一行中。

但是,这可能会更改聚合语句的语义,因此您需要在进行此更改后验证查询是否按您的意愿工作。

于 2012-10-10T17:21:43.930 回答