Sub kueri SQL Server

Sep 25 2020

Saya ingin menggabungkan 2 kueri SQL, kueri pertama saya ingin menarik kembali catatan karyawan untuk bulan terakhir, dan kueri kedua, menarik kembali catatan selama 3 bulan terakhir.

Ada metode gila, karyawan dapat berganti manajer setiap bulan, tetapi manajer bulan terakhir perlu melihat catatan 3 bulan sebelumnya untuk karyawan mereka, bahkan jika karyawan tersebut memiliki manajer yang berbeda untuk bulan-bulan itu.

Ini adalah pilihan pertama yang menarik dalam bulan terakhir

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

ini adalah pilihan untuk ditarik dalam 3 bulan terakhir

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

saya akan bergabung dengan 2 pilihan di [EMPLOYEE_ID]. Ada ide bagaimana saya bisa menggabungkan 2 pertanyaan ini? Terima kasih!

Jawaban

1 GordonLinoff Sep 25 2020 at 17:45

Jika Anda ingin menggabungkan dua tabel, Anda akan menggunakan:

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;

Saya akan menambahkan bahwa hasil ini tidak masuk akal bagi saya. Tapi ini adalah pertanyaan yang Anda tanyakan secara khusus.

1 TimBiegeleisen Sep 25 2020 at 16:36

Saya akan menggunakan:

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;

WHEREKlausa di atas cocok dengan kueri kedua Anda, dan kami menggunakan TOP 1 WITH TIESpendekatan untuk mendapatkan rekaman yang memiliki nilai maksimum REPORT_DTdalam tabel.

1 MichałTurczyn Sep 25 2020 at 16:52

Anda juga dapat menggunakan 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())))

Mengenai komentar, kueri ini harus menyelesaikan masalah:

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

Saya pikir Anda ingin mendapatkan daftar [EMPLOYEE_ID] untuk bulan terakhir. Dan dapatkan riwayat kerja 3 bulan mereka. Menurut skrip pilih Anda saat ini (saya tidak mengerti skrip pilih pertama Anda apakah itu memberikan daftar karyawan atau tidak), Anda dapat melakukan seperti ini. Tetapi ini bukanlah solusi yang efektif. Anda juga dapat menambahkan sub pilihan di bagian bergabung. Silakan coba ini dulu.

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

Saya membuat Tampilan menggunakan kueri di bawah ini, dan kemudian menggabungkan ini dengan prompt tanggal 3 bulan (ini digunakan pada laporan Objek Bisnis) dan itu berhasil.

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)