SQL은

2009-04-11 2 views
0

에 있던 열 2 열에서 가장 최근의 날짜를 찾아 식별 나는 다음과 같은 구조로 tblAssetsInUse라는 테이블이 있습니다SQL은

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 코드가 있는데이 코드를 사용하여 별도의 Assets View에 연결하면 작동합니다. 가장 최근 날짜가 체크 아웃 또는 체크인 열에 있다면 어떻게 든 해결할 수 있어야합니다.

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 

결과에 비트 값이 표시되도록 추가 할 수있는 일종의 리터럴 값이 있습니까? 당신의 도움에 대한

감사합니다,

폴 레이놀즈

답변

0

가 옆에 작업 유형을 수행 얻기에서, 나는 전체 쿼리가이 방법을 단순화 (최적화) 될 수 있다는 생각도 참고 첫 번째 줄에있는 TOP 1을 제거하여 마지막으로 자산을 체크인하고 마지막으로 체크 아웃합니다.

+0

니스! 나는이 최적화를 할 것이라고 생각한다. 아주 좋은 생각 같아. 그러면 코드에서 어떤 것이 작동했는지 확인하는 작업을 확인할 수 있습니다. 고맙습니다! –

0

한 가지 방법은 CASE 문을 사용하고 SELECT하는 것 중 하나 MAX 날짜 값이 IN 또는 OUT

1

시도인지 여부에 따라 IN 또는 OUT 내부 검색어로 사용 :

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

UNION 

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

편집 추가 : 더 매끄러운 솔루션은 두 날짜를 비교하는 더 큰 사용자 정의 함수를 만드는 것입니다.

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 

편집 :

+0

더 좋은 방법 일 수 있습니다. - 좋은 전화 –

+0

나는 그것을 아주 좋아합니다! 치료를해라. 건배 제이미. 별칭을 추가해야했지만 외부 선택 및 그룹화에 추가해야했습니다. 이 말이 맞습니까? –

+0

예, 맞습니다. –

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