Truy vấn phụ SQL Server

Sep 25 2020

Tôi muốn kết hợp 2 truy vấn SQL, truy vấn đầu tiên tôi muốn lấy lại bản ghi của nhân viên cho tháng gần nhất và truy vấn thứ hai, kéo lại bản ghi trong 3 tháng qua.

Có một phương pháp khá điên rồ, nhân viên có thể thay đổi người quản lý mỗi tháng, nhưng người quản lý của tháng gần nhất cần phải xem hồ sơ 3 tháng trước đó của nhân viên của họ, ngay cả khi nhân viên đó đã có một người quản lý khác trong những tháng đó.

Đây là lựa chọn đầu tiên để kéo trong tháng gần nhất

/******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])

đây là lựa chọn để kéo trong 3 tháng qua

/*********last 3 months*******************/
SELECT [REPORT_DT]
      ,[EMPLOYEE_ID]
      ,[EMPLOYEE_NAME]
      ,[LOCATION]
      ,[JOB_DESCRIPTION]
      ,[MANAGER_ID]
  FROM [EMPLOYEE]
  where [REPORT_DT]>=
  ( DATEADD(M, -3, GETDATE()))

tôi sẽ tham gia 2 lựa chọn trên [EMPLOYEE_ID]. Bất kỳ ý tưởng nào về cách tôi có thể kết hợp 2 truy vấn này? Cảm ơn!

Trả lời

1 GordonLinoff Sep 25 2020 at 17:45

Nếu bạn muốn tham gia hai bảng, bạn sẽ sử dụng:

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;

Tôi sẽ nói thêm rằng kết quả này không có ý nghĩa đặc biệt đối với tôi. Nhưng đây là câu hỏi mà bạn đặc biệt yêu cầu.

1 TimBiegeleisen Sep 25 2020 at 16:36

Tôi sẽ dùng:

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;

WHEREMệnh đề trên phù hợp với truy vấn thứ hai của bạn và chúng tôi sử dụng TOP 1 WITH TIEScách tiếp cận để lấy các bản ghi có REPORT_DTgiá trị lớn nhất trong bảng.

1 MichałTurczyn Sep 25 2020 at 16:52

Bạn cũng có thể sử dụng 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())))

Về nhận xét, truy vấn này sẽ giải quyết vấn đề:

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())))
ORCAs Sep 25 2020 at 16:44

Tôi nghĩ bạn muốn nhận danh sách [EMPLOYEE_ID] cho tháng gần nhất. Và xem lịch sử làm việc 3 tháng của họ. Theo các tập lệnh lựa chọn hiện tại của bạn (tôi không hiểu tập lệnh chọn đầu tiên của bạn có đưa ra danh sách nhân viên hay không), bạn có thể làm như thế này. Nhưng nó không phải là một giải pháp hiệu quả. Bạn cũng có thể thêm lựa chọn phụ trong phần tham gia. Đầu tiên hãy thử cái này.

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]))
Blowers Oct 16 2020 at 15:46

Tôi đã tạo Chế độ xem bằng cách sử dụng truy vấn bên dưới, sau đó kết hợp điều này với lời nhắc ngày 3 tháng (điều này đang được sử dụng trên báo cáo Đối tượng kinh doanh) và điều đó đã thành công.

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)