SQL Server-Unterabfrage

Sep 25 2020

Ich möchte 2 SQL-Abfragen kombinieren, die erste Abfrage, bei der ich Mitarbeiterdatensätze für den letzten Monat zurückziehen möchte, und die zweite Abfrage, bei der Datensätze für die letzten 3 Monate zurückgezogen werden sollen.

Es gibt eine Methode für den Wahnsinn, Mitarbeiter können jeden Monat den Manager wechseln, aber der Manager der letzten Monate muss die vorherigen 3-Monats-Datensätze für seinen Mitarbeiter anzeigen, selbst wenn dieser Mitarbeiter für diese Monate einen anderen Manager hatte.

Dies ist die erste Auswahl im letzten Monat

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

Dies ist die Auswahl, die in den letzten 3 Monaten gezogen werden soll

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

Ich würde mich den 2 Auswahlen auf [EMPLOYEE_ID] anschließen. Irgendwelche Ideen, wie ich diese 2 Abfragen kombinieren kann? Vielen Dank!

Antworten

1 GordonLinoff Sep 25 2020 at 17:45

Wenn Sie die beiden Tabellen verbinden möchten, verwenden Sie:

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;

Ich werde hinzufügen, dass dieses Ergebnis für mich keinen besonderen Sinn ergibt. Dies ist jedoch die Frage, die Sie speziell gestellt haben.

1 TimBiegeleisen Sep 25 2020 at 16:36

Ich würde ... benutzen:

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;

Die obige WHEREKlausel entspricht Ihrer zweiten Abfrage, und wir verwenden einen TOP 1 WITH TIESAnsatz, um die Datensätze mit den Maximalwerten REPORT_DTin der Tabelle zu erhalten.

1 MichałTurczyn Sep 25 2020 at 16:52

Sie können auch verwenden 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())))

In Bezug auf Kommentare sollte diese Abfrage das Problem lösen:

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

Ich dachte, Sie möchten die Liste [EMPLOYEE_ID] für den letzten Monat erhalten. Und erhalten Sie ihre 3-monatige Arbeitshistorie. Entsprechend Ihren aktuellen Auswahlskripten (ich habe Ihr erstes Auswahlskript nicht verstanden, ob es eine Mitarbeiterliste enthält oder nicht) können Sie dies tun. Aber es ist keine effektive Lösung. Sie können auch eine Unterauswahl im Join-Bereich hinzufügen. Versuchen Sie dies bitte zuerst.

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

Ich habe mit der folgenden Abfrage eine Ansicht erstellt und diese dann mit einer 3-Monats-Eingabeaufforderung kombiniert (diese wird in einem Business Objects-Bericht verwendet).

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)