[英]SQL Server sub query
我想合並 2 個 SQL 查詢,第一個查詢我想拉回最近一個月的員工記錄,第二個查詢拉回過去 3 個月的記錄。
有一種瘋狂的方法,員工可以每個月更換經理,但最近幾個月的經理需要查看他們員工的前 3 個月記錄,即使該員工在這幾個月有不同的經理。
這是最近一個月的第一個選擇
/******latest month*****************/
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
where [REPORT_DT]=
(select max([REPORT_DT]) from [EMPLOYEE])
這是過去 3 個月的選擇
/*********last 3 months*******************/
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
where [REPORT_DT]>=
( DATEADD(M, -3, GETDATE()))
我將加入 [EMPLOYEE_ID] 上的 2 個選擇。 有什么想法可以組合這兩個查詢嗎? 謝謝!
我會用:
SELECT TOP 1 WITH TIES
[REPORT_DT],
[EMPLOYEE_ID],
[EMPLOYEE_NAME],
[LOCATION],
[JOB_DESCRIPTION],
[MANAGER_ID],
FROM [EMPLOYEE]
WHERE
[REPORT_DT] >= DATEADD(M, -3, GETDATE()
ORDER BY
[REPORT_DT] DESC;
上面的WHERE
子句匹配您的第二個查詢,我們使用TOP 1 WITH TIES
方法來獲取表中具有最大REPORT_DT
值的記錄。
您也可以使用EXISTS
:
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
WHERE [REPORT_DT] = (SELECT MAX([REPORT_DT]) FROM [EMPLOYEE]) AND
EXISTS( SELECT 1 FROM [EMPLOYEE]
WHERE [EMPLOYEE_ID] == t.[EMPLOYEE_ID] AND
[REPORT_DT] >= (DATEADD(M, -3, GETDATE())))
關於評論,這個查詢應該可以解決問題:
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
WHERE [REPORT_DT] >= (DATEADD(M, -3, GETDATE())) AND
EXISTS( SELECT 1 FROM [EMPLOYEE]
WHERE [EMPLOYEE_ID] == t.[EMPLOYEE_ID] AND
[REPORT_DT] >= (DATEADD(M, -1, GETDATE())))
如果要連接兩個表,可以使用:
select ecurr.*, e.* -- or whatever columns you like
from employee ecurr join
employee e
on ecurr.employee_id = e.employee_id
where ecurr.report_dt = (select max(e2.report_dt) from employee e2) and
e.report_dt >= dateadd(month, 3, getdate())
order by ecurr.employee_id, e.report_dt;
我要補充一點,這個結果對我來說沒有特別的意義。 但這是你特別提出的問題。
我以為您想獲取最近一個月的 [EMPLOYEE_ID] 列表。 並獲得他們 3 個月的工作歷史。 根據您當前的選擇腳本(我不明白您的第一個選擇腳本是否提供員工列表),您可以這樣做。 但這不是一個有效的解決方案。 您還可以在連接部分添加子選擇。 請先試試這個。
SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
where [REPORT_DT]>=(DATEADD(M, -3, GETDATE()))
AND [EMPLOYEE_ID] IN (SELECT [REPORT_DT]
,[EMPLOYEE_ID]
,[EMPLOYEE_NAME]
,[LOCATION]
,[JOB_DESCRIPTION]
,[MANAGER_ID]
FROM [EMPLOYEE]
where [REPORT_DT]=
(select max([REPORT_DT]) from [EMPLOYEE]))
我使用以下查詢創建了一個視圖,然后將其與 3 個月的日期提示(這用於 Business Objects 報告)結合起來,就成功了。
SELECT
b.[MANAGER_ID],
a.[EMPLOYEE_ID],
a.[START_DT],
a.[EMPLOYEE_NAME],
a.[LOCATION],
a.[JOB_DESCRIPTION],
a.[REPORT_DT]
FROM [EMPLOYEE] b INNER JOIN
[EMPLOYEE] a
ON b.[EMPLOYEE_ID] = a.[EMPLOYEE_ID]
WHERE b.[REPORT_DT] = (SELECT MAX(c.[REPORT_DT])
FROM [EMPLOYEE] c)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.