SQLServerサブクエリ

Sep 25 2020

2つのSQLクエリを組み合わせたいと思います。最初のクエリは直近の月の従業員レコードをプルバックし、2番目のクエリは過去3か月のレコードをプルバックします。

狂気には方法があり、従業員は毎月マネージャーを変更できますが、直近の月のマネージャーは、その従業員がその月に別のマネージャーを持っていたとしても、その従業員の過去3か月の記録を確認する必要があります。

これは、先月にプルする最初の選択です

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

これは過去3か月でプルする選択です

/*********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]の2つの選択に参加します。これらの2つのクエリをどのように組み合わせることができるかについてのアイデアはありますか?ありがとう!

回答

1 GordonLinoff Sep 25 2020 at 17:45

2つのテーブルを結合する場合は、次を使用します。

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;

この結果は私には特に意味がないことを付け加えておきます。しかし、これはあなたが具体的に尋ねた質問です。

1 TimBiegeleisen Sep 25 2020 at 16:36

私は使うだろう:

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;

上記のWHERE句は2番目のクエリと一致し、TOP 1 WITH TIESアプローチを使用REPORT_DTして、テーブル内の最大値を持つレコードを取得します。

1 MichałTurczyn Sep 25 2020 at 16:52

あなたも使用することができます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())))

コメントに関して、このクエリは問題を解決するはずです:

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

先月の[EMPLOYEE_ID]リストを取得したいと思いました。そして、3か月の作業履歴を取得します。現在の選択スクリプト(従業員リストが表示されるかどうかに関係なく、最初の選択スクリプトがわかりませんでした)によると、次のように実行できます。しかし、それは効果的な解決策ではありません。結合セクションでサブ選択を追加することもできます。まずこれを試してください。

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

以下のクエリを使用してビューを作成し、これを3か月の日付プロンプト(これはBusiness Objectsレポートで使用されています)と組み合わせて、それでうまくいきました。

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)