SQL Server alt sorgusu

Sep 25 2020

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

1 GordonLinoff Sep 25 2020 at 17:45

İ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.

1 TimBiegeleisen Sep 25 2020 at 16:36

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 .

1 MichałTurczyn Sep 25 2020 at 16:52

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

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

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)