Sub kueri SQL Server
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
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.
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.
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())))
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]))
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)