0

次の構造を持つtblAssetsInUseというテーブルがあります。

intPK      intAssetID      datCheckedOut     datCheckedIn
1          450             1/5/2009          10/5/2009
2          300             2/5/2009          <NULL>
3          200             2/5/2009          <NULL>
4          450             12/5/2009         5/7/2009

スキャンされたアセットIDを受け取り、チェックアウトまたはインされているアセットのテーブルにそれぞれ挿入または更新するSPがあります。ご覧のとおり、datCheckedInはNullである可能性があり、現在使用されているアセットを特定するために使用されます。この手順は完全に機能します。スキャンされる最後のアセットが何であったか、またテーブルに対する最後の操作(つまり、チェックインまたはチェックアウト)が何であったかを判別できるようにしたいと思います。(どの列に関係なく)最新の日付の行を見つけるSQLコードがあり、これを使用して別のアセットビューに結合します。これも機能します。どういうわけか、最新の日付が[チェックアウト]または[チェックイン]列にあるかどうかを確認できる必要があります。

SELECT TOP (1) allDates.intPK, MAX(allDates.datLastAction) AS datLastScan,    dbo.viwAssets.strFriendlyName, tblAssetsInUse_join.intAssetID
FROM (SELECT intPK, MAX(datCheckedOut) AS datLastAction
      FROM dbo.tblAssetsInUse AS tblAssetsInUse_out
      GROUP BY intPK

      UNION ALL

      SELECT intPK, MAX(datCheckedIn) AS datLastAction
      FROM dbo.tblAssetsInUse AS tblAssetsInUse_in
      GROUP BY intPK) AS allDates 
INNER JOIN
dbo.tblAssetsInUse AS tblAssetsInUse_join ON allDates.intPK = tblAssetsInUse_join.intPK 
INNER JOIN
dbo.viwAssets ON tblAssetsInUse_join.intAssetID = dbo.viwAssets.intPK
GROUP BY allDates.intPK, dbo.viwAssets.strFriendlyName, tblAssetsInUse_join.intAssetID
ORDER BY datLastScan DESC

結果のビット値にフラグを立てるために追加できるリテラル値はありますか?

ご協力いただきありがとうございます、

ポール・レイノルズ

4

4 に答える 4

1

これを内部クエリとして試してください。

SELECT intPK, 'Out', MAX(datCheckedOut)
FROM dbo.tblAssetsInUse
GROUP BY intPK

UNION

SELECT intPK, 'In', MAX(datCheckedIn)
FROM dbo.tblAssetsInUse
GROUP BY intPK

追加するために編集:より洗練された解決策は、2つの日付を比較するGreaterユーザー定義関数を作成することです。

于 2009-04-11T12:46:03.480 に答える
0

実行される操作のタイプを取得する以外に、クエリ全体を次のように単純化(および最適化)できると思います。

SELECT TOP 1 allDates.intPK, allDates.datLastAction AS datLastScan, allDates.operation, dbo.viwAssets.strFriendlyName, tblAssetsInUse_join.intAssetID
FROM (SELECT TOP 1 intPK, intAssetID, datCheckedOut AS datLastAction, 'Out' AS operation
  FROM dbo.tblAssetsInUse AS tblAssetsInUse_out
  ORDER BY datCheckedOut DESC

  UNION ALL

  SELECT TOP 1 intPK, intAssetID, datCheckedIn AS datLastAction, 'In' AS operation
  FROM dbo.tblAssetsInUse AS tblAssetsInUse_in
  ORDER BY datCheckedIn DESC) AS allDates 
INNER JOIN
  dbo.viwAssets ON allDates.intAssetID = dbo.viwAssets.intPK
ORDER BY datLastScan DESC

編集:最初の行のTOP 1を削除すると、最後にチェックインされたアセットと最後にチェックアウトされたアセットの両方が取得されることにも注意してください。

于 2009-04-11T13:00:08.970 に答える
0

1つの方法は、CASEステートメントを使用してSELECTを使用するか、日付値がまたはであるかどうINOUTに応じて選択することです。MAXINOUT

于 2009-04-11T12:44:03.797 に答える
0

これは機能するはずです。2つのアイテムが同時にチェックインまたはチェックアウトされた場合は、もちろん複数の行が表示されます。

SELECT
     intPK,
     intAssetID,
     datCheckedOut,
     datCheckedIn,
     CASE
          WHEN datCheckedIn IS NOT NULL THEN 'Checked In'
          ELSE 'Checked Out'
     END AS last_action
FROM
     tblAssetsInUse AIU
INNER JOIN
     (
          SELECT
               MAX(datCheckedOut) AS max_in,
               MAX(datCheckedIn) AS max_out
          FROM
               tblAssetsInUse
     ) SQ ON
     CASE
          WHEN max_in > max_out THEN max_in
          ELSE NULL
     END = AIU.datCheckedIn OR
     CASE
          WHEN max_out > max_in THEN max_out
          ELSE NULL
     END = AIU.datCheckedOut
于 2009-04-11T13:15:22.567 に答える