แบบสอบถามย่อยของ SQL Server
ฉันต้องการรวมแบบสอบถาม 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()))
ฉันจะเข้าร่วม 2 รายการที่เลือกใน [EMPLOYEE_ID] มีความคิดอย่างไรที่ฉันจะรวม 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;
ฉันจะเพิ่มว่าผลลัพธ์นี้ไม่สมเหตุสมผลสำหรับฉัน แต่นี่เป็นคำถามที่คุณถามโดยเฉพาะ
ฉันจะใช้:
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ประโยคข้างต้นตรงกับคำค้นหาที่สองของคุณและเราใช้TOP 1 WITH TIESวิธีการเพื่อให้ได้ระเบียนที่มีREPORT_DTค่าสูงสุดในตาราง
คุณสามารถใช้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())))
ฉันคิดว่าคุณต้องการรับรายชื่อ [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]))
ฉันสร้างข้อมูลพร็อพเพอร์ตี้โดยใช้แบบสอบถามด้านล่างจากนั้นรวมสิ่งนี้กับพรอมต์วันที่ 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)