1

過去 48 時間更新されていない未処理のサービス注文を従業員が持っているかどうかを通知する SQL スクリプトがあります。こんな感じ(簡略化)

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)

LastModified のどの日付がより新しいかを確認するには、Coalesce の代わりに case ステートメントを実行する必要がある場合があります。

于 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 に答える