1

我有一个 SQL 脚本,它告诉我我的任何员工是否有任何在过去 48 小时内未更新的未结服务订​​单。它看起来像这样(简化) -

select ServiceOrder, RepName from NotesTable

join OrdersTable on OrdersTable.OrderNumber=NotesTable.OrderNumber

having (DATEDIFF(day,max(NotesTable.LastModified),GETDATE()) >2)

基本上只取今天的日期,减去最近注释的最后修改日期,然后吐出 48 小时内未修改的服务订单数。

我的问题是,如果服务订单没有备注,则此脚本不起作用。因此,即使它在 48 小时内没有更新,它也不会出现在报告中。我需要说什么样的“或”“如果它没有注释也告诉我”。

我考虑加入另一个包含“dateopened”字段的表,然后,

OR (DATEDIFF(day,(NotesTable.DateOpened),GETDATE()) >2)

但这会返回超过 48 小时的每个服务订单,所以这无济于事。

想法?

4

4 回答 4

3

实际上,您仍然缺少部分查询(GROUP BY例如 ),但这应该让您了解您想要什么:

SELECT ServiceOrder, RepName 
FROM OrdersTable 
LEFT JOIN NotesTable
    ON OrdersTable.OrderNumber = NotesTable.OrderNumber
GROUP BY ServiceOrder, RepName 
HAVING (DATEDIFF(DAY,MAX(NotesTable.LastModified),GETDATE()) >2)
OR MAX(NotesTable.LastModified) IS NULL
于 2013-01-28T20:56:05.513 回答
2

如果默认情况下 [Orders] 表中的每条记录都有 [NotesTable] 记录,那么这将起作用。

将 [NotesTable].[LastModified] 更改为 Isnull([NotesTable].[LastModified],[NotesTable].[DateOpened])...
这将使用“LastModified”(如果存在),如果不存在则使用“DateOpened” “ 反而。

于 2013-01-28T20:19:16.000 回答
0

您需要包含与注释相关的另一个表。也许这是一个订单表?希望该表有一些字段来指示上次修改的时间。

    select ServiceOrder, RepName from Orders
    left outer join NotesTable
    on Orders.OrderID = NotesTable.OrderID


    having (DATEDIFF(day,max(Coalesce(NotesTable.LastModified,
       Orders.LastModified)),GETDATE()) >2)

您可能需要做一个案例陈述而不是 Coalesce 来查看哪个 LastModified 日期更近。

于 2013-01-28T20:56:17.673 回答
-1

您可以使用 ISNULL ( http://msdn.microsoft.com/en-us/library/ms184325.aspx )

select ServiceOrder, RepName 
from NotesTable
having (DATEDIFF(day,max(ISNULL(NotesTable.LastModified,NotesTable.DateOpened )),GETDATE()) >2)
于 2013-01-28T20:19:49.543 回答