2012-03-01 97 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()