2012-03-01 2 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() в Access дает последний элемент столбца, который вы ищете в . Пример: 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-emp для максимального om-dt-end, попробуйте:

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() 
Смежные вопросы