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

并且我有一个 SP 接收扫描的资产 ID,然后分别插入或更新表中的资产以检出或检入。如您所见,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

编辑添加:一个更巧妙的解决方案是创建一个比较两个日期的更大的用户定义函数。

于 2009-04-11T12:46:03.480 回答
0

一种方法是使用CASE语句和 SELECTIN或者OUT取决于MAX日期值是INOUT

于 2009-04-11T12:44:03.797 回答
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

这应该有效。如果您最终在同一时间签入或签出两个项目,您当然会得到多行。

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 回答