我有一个SQL脚本,告诉我我的员工是否有任何在过去48小时内未更新的开放服务订单。它看起来像这样(简化) -
select ServiceOrder, RepName from NotesTable
join OrdersTable on OrdersTable.OrderNumber=NotesTable.OrderNumber
having (DATEDIFF(day,max(NotesTable.LastModified),GETDATE()) >2)
基本上只需要今天的日期,减去最近一次音符的最后修改日期,并吐出48小时内未修改的服务订单数量。
我的问题是,如果服务订单有 no 注释,则此脚本不起作用。因此即使它在48小时内没有更新,它也没有出现在报告中。什么样的“或”我需要说“还告诉我它是否没有笔记。”
我考虑加入另一个包含“dateopened”字段的表,然后
OR (DATEDIFF(day,(NotesTable.DateOpened),GETDATE()) >2)
但是会返回超过48小时的每个服务订单,因此无效。
思想?
答案 0 :(得分: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
答案 1 :(得分:2)
如果[Orders]表中的每条记录默认都有[NotesTable]记录,那么这将起作用。
将[NoteTable]。[LastModified]更改为Isnull([NotesTable]。[LastModified],[NoteTable]。[DateOpened])...
这将使用“LastModified”(如果它存在),如果不存在则将使用“DateOpened”。
答案 2 :(得分: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日期更新。
答案 3 :(得分:-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)