SQL Server alt sorgusu
2 SQL sorgusunu birleştirmek istiyorum, son aya ait çalışan kayıtlarını geri çekmek istediğim ilk sorgu ve ikinci sorgu, son 3 aya ait kayıtları geri çek.
Çılgınlığın bir yöntemi var, çalışanlar her ay yönetici değiştirebiliyor, ancak son aylardaki yöneticinin, çalışanın o aylarda farklı bir yöneticisi olsa bile, çalışanlarının önceki 3 aylık kayıtlarını görmesi gerekiyor.
Bu, son ayda çekilecek ilk seçim
/******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])
bu son 3 ay içinde çekilecek seçim
/*********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] üzerindeki 2 seçime katılacaktım. Bu 2 sorguyu nasıl birleştirebileceğime dair bir fikrin var mı? Teşekkürler!
Yanıtlar
İki masayı birleştirmek istiyorsanız, şunu kullanmalısınız:
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;
Bu sonucun bana özel bir anlam ifade etmediğini de ekleyeceğim. Ama özellikle sorduğunuz soru bu.
Kullanmak istiyorum:
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;
Yukarıdaki WHEREcümle, ikinci sorgunuzla eşleşir ve tablodaki TOP 1 WITH TIESmaksimum REPORT_DTdeğerlere sahip kayıtları elde etmek için bir yaklaşım kullanırız .
Ayrıca şunları da kullanabilirsiniz 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())))
Yorumla ilgili olarak, bu sorgu sorunu çözmelidir:
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())))
Son ayın [EMPLOYEE_ID] listesini almak istediğini düşündüm. Ve 3 aylık çalışma geçmişlerini alın. Mevcut seçim komut dosyalarınıza göre (ilk seçim komut dosyanızı bir çalışan listesi verip vermediğini anlamadım) bunu yapabilirsiniz. Ama etkili bir çözüm değil. Ayrıca birleştirme bölümüne alt seçim de ekleyebilirsiniz. Önce bunu deneyin lütfen.
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]))
Aşağıdaki sorguyu kullanarak bir Görünüm oluşturdum ve ardından bunu 3 aylık bir tarih bilgi istemiyle birleştirdim (bu, İş Nesneleri raporunda kullanılıyor) ve bu hile yaptı.
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)