SQL सर्वर सब क्वेरी

Sep 25 2020

मैं 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

यदि आप दो तालिकाओं में शामिल होना चाहते हैं, तो आप उपयोग करेंगे:

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खंड आपकी दूसरी क्वेरी से मेल खाता है, और हम तालिका में 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 महीने की डेट प्रॉम्प्ट के साथ जोड़ दिया (यह एक बिजनेस ऑब्जेक्ट्स रिपोर्ट पर इस्तेमाल किया जा रहा है) और इसने यह ट्रिक की।

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)