2012-03-01 13 views
2

にMS Accessクエリの変換:私は、MSSQLで実行する必要があり、次のアクセスのクエリを持っているSQL Serverクエリ

SELECT 
    [PUB_op-mstr].[om-job], 
    Last([PUB_op-mstr].[om-emp]) AS [LastOfom-emp], 
    Max([PUB_op-mstr].[om-dt-end]) AS [MaxOfom-dt-end], 
    [PUB_op-mstr].[om-wkctr] 

FROM 
    PUB_wc_mstr INNER JOIN [PUB_op-mstr] 
    ON 
    PUB_wc_mstr.wc_wkctr = [PUB_op-mstr].[om-wkctr] 
GROUP BY 
    [PUB_op-mstr].[om-job], 
    [PUB_op-mstr].[om-wkctr], 
    PUB_wc_mstr.wc_dept 
HAVING 
    (((Max([PUB_op-mstr].[om-dt-end]))>=Date()-7 
    And 
    (Max([PUB_op-mstr].[om-dt-end]))<Date()) 
    AND ((PUB_wc_mstr.wc_dept)="633" Or (PUB_wc_mstr.wc_dept)="646")); 

答えて

1

MS SQLはLAST集約関数をサポートしていません。したがって、Min/Maxで置き換えることができます。 。

one 
two 
three 

T1は1列c1、含まれているがありますかあなたは、Accessで

[LastOfom-emp] = (SELECT ... 
1

LAST()ようSELECTはあなたが 例で探している列の最後の要素を与える独自のものを書くいますステートメント:

SELECT LAST(c1) FROM T1 

この機能をSQL Serverに移植することは可能ですが、テーブルにソートされた列が少なくとも1つある場合にのみ実行できます。列の最後の要素を取得するには、あなたは何をする必要があります:

SELECT TOP(1) c1 FROM T1 ORDER BY c1 DESC; 

これはすなわち、「2」(列がソートされていないので)、あなたは間違った結果を与えるだろう。したがって、この場合には正しい答えを見つけるために、あなたは別の列が必要になり、例えばインクリメントID

c1  c2 
one 1 
two 2 
three 3 

は今、次のことができます。C2がソートされているので

SELECT TOP(1) c1 FROM T1 ORDER BY c2 DESC; 

、あなたが今の結果を得ます"三"。

1

最大om-dt-endためom-emp値がLast([PUB_op-mstr].[om-emp])をされたと仮定すると、試してみてください。

select [om-job], [LastOfom-emp], [MaxOfom-dt-end], [om-wkctr] from 
(SELECT [PUB_op-mstr].[om-job], 
     [PUB_op-mstr].[om-emp] AS [LastOfom-emp], 
     [PUB_op-mstr].[om-dt-end] AS [MaxOfom-dt-end], 
     [PUB_op-mstr].[om-wkctr], 
     row_number() over (partition by [PUB_op-mstr].[om-job], 
             [PUB_op-mstr].[om-wkctr], 
             PUB_wc_mstr.wc_dept 
          order by [PUB_op-mstr].[om-dt-end] desc) rn 
FROM PUB_wc_mstr 
JOIN [PUB_op-mstr] 
    ON PUB_wc_mstr.wc_wkctr = [PUB_op-mstr].[om-wkctr] 
WHERE PUB_wc_mstr.wc_dept IN ('633','646') 
) sq 
where rn=1 and 
     [MaxOfom-dt-end]>=Dateadd(d,-7, getdate()) And 
     [MaxOfom-dt-end]< getdate() 
関連する問題