2012-03-01 136 views
2

我有以下的訪問查詢,我需要在MSSQL運行:轉換MS Access查詢到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代替它。或者你有寫自己的SELECT

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

在訪問LAST()給您正在尋找在 例列的最後一個元素:T1有一列c1,其中包含:

one 
two 
three 

聲明:

SELECT LAST(c1) FROM T1 

給出:三個

將此函數移植到SQL Server是可行的,但前提是表中至少有一個排序列。要得到列的最後一個元素,你就必須做到:

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

這會給你錯誤的結果,即「兩化」(因爲該列不排序)。所以,在這種情況下找到正確的答案,你需要另一列,例如一個遞增的ID

c1  c2 
one 1 
two 2 
three 3 

現在,您可以:

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

由於C2進行排序,你現在得到的結果「三」。

1

假設Last([PUB_op-mstr].[om-emp])被用於最大om-dt-endom-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()