5

को संभालने के लिए रिकर्सिव सीटीई का उपयोग करें काम पर, मेरे असाइनमेंट में से एक बिक्री कर्मचारियों को कमीशन की गणना करना है। एक नियम दूसरों की तुलना में अधिक चुनौतीपूर्ण रहा है।दिनांक तर्क

दो बिक्री टीम ए और बी प्रत्येक बिक्री के विभिन्न उत्पादों को एक साथ काम करते हैं। टीम ए टीम बी को लीड भेज सकता है। वही ग्राहक कई बार भेज सकता है। पहली बार एक ग्राहक (पूर्व लीड 1) * एक कमीशन भेजता है जो टीम ए में विक्रेता को भुगतान करता है जिसने लीड बनाई है। अब ग्राहक अगले 365 दिनों के लिए "लॉक" है (दिनांक लीड 1 से गिनती हुई थी) । इसका अर्थ यह है कि उस अवधि में उस ग्राहक के लिए कोई अतिरिक्त कमी नहीं मिल सकती है, अतिरिक्त लीड भेजकर (पूर्व लीड 2 और 3 को कोई कमीशन नहीं मिलता है)। 365 दिनों की अवधि समाप्त हो जाने के बाद। एक नया लीड बनाया जा सकता है और कमीशन प्राप्त कर सकता है (पूर्व लीड 4)। फिर ग्राहक को दिन के लीड 4 से गिनती 365 दिनों के लिए फिर से बंद कर दिया जाता है। इसलिए, लीड 5 को कोई कमीशन नहीं मिलता है। मुश्किल हिस्सा उस तारीख को रीसेट करना है जिस पर 365 दिन गिना जाता है।

'* तालिका #LEADS और #DISERED परिणाम के लिए संदर्भ।

मैंने कर्सर का उपयोग करके tSQL में समस्या हल कर दी है, लेकिन मुझे आश्चर्य है कि इसके बजाय रिकर्सिव सीटीई का उपयोग करना संभव था। मैंने नीचे दिए गए सर्वश्रेष्ठ प्रयासों को कई प्रयास किए हैं। मेरे समाधान के साथ समस्या यह है कि मैं रिकर्सिव टेबल को एक से अधिक बार संदर्भित करता हूं। मैंने सीटीई के अंदर एक सीटीई घोंसले के साथ उस समस्या को ठीक करने की कोशिश की है। इसकी अनुमति नहीं है। मैंने सीटीई के अंदर एक अस्थायी तालिका का उपयोग करने की कोशिश की है जिसे अनुमति नहीं है। मैंने कई बार सीटीई के रिकर्सिव भाग को रिकोड करने की कोशिश की ताकि रिकर्सिव टेबल को केवल एक बार संदर्भित किया जा सके, लेकिन फिर मैं काम करने के लिए तर्क प्राप्त नहीं कर पा रहा हूं।

मैं उपयोग कर रहा हूँ एसक्यूएल 2008

IF OBJECT_ID('tempdb.dbo.#LEADS', 'U') IS NOT NULL 
DROP TABLE #LEADS; 

CREATE TABLE #LEADS (LEAD_ID INT, CUSTOMER_ID INT, LEAD_CREATED_DATE DATETIME, SALESPERSON_NAME varchar(20)) 
INSERT INTO #LEADS 
VALUES (1, 1, '2013-09-01', 'Rasmus') 
     ,(2, 1, '2013-11-01', 'Christian') 
     ,(3, 1, '2014-01-01', 'Nadja') 
     ,(4, 1, '2014-12-24', 'Roar') 
     ,(5, 1, '2015-12-01', 'Kristian') 
     ,(6, 2, '2014-01-05', 'Knud') 
     ,(7, 2, '2015-01-02', 'Rasmus') 
     ,(8, 2, '2015-01-08', 'Roar') 
     ,(9, 2, '2016-02-05', 'Kristian') 
     ,(10, 2, '2016-03-05', 'Casper') 

SELECT * 
FROM #LEADS; 

IF OBJECT_ID('tempdb.dbo.#DISERED_RESULT', 'U') IS NOT NULL 
DROP TABLE #DISERED_RESULT; 

CREATE TABLE #DISERED_RESULT (LEAD_ID INT, DESIRED_COMMISION_RESULT CHAR(3)) 
INSERT INTO #DISERED_RESULT 
VALUES (1, 'YES') 
     ,(2, 'NO') 
     ,(3, 'NO') 
     ,(4, 'YES') 
     ,(5, 'NO') 
     ,(6, 'YES') 
     ,(7, 'NO') 
     ,(8, 'YES') 
     ,(9, 'YES') 
     ,(10, 'NO') 

    SELECT * 
    FROM #DISERED_RESULT; 

WITH COMMISSION_CALCULATION AS 
(
    SELECT T1.* 
      ,COMMISSION = 'YES' 
      ,MIN_LEAD_CREATED_DATE AS COMMISSION_DATE 
    FROM  #LEADS AS T1 
    INNER JOIN (
       SELECT A.CUSTOMER_ID 
         ,MIN(A.LEAD_CREATED_DATE) AS MIN_LEAD_CREATED_DATE 
       FROM #LEADS AS A 
       GROUP BY A.CUSTOMER_ID 
       ) AS T2 ON T1.CUSTOMER_ID = T2.CUSTOMER_ID AND T1.LEAD_CREATED_DATE = T2.MIN_LEAD_CREATED_DATE 

UNION ALL 

SELECT T10.LEAD_ID 
     ,T10.CUSTOMER_ID 
     ,T10.LEAD_CREATED_DATE 
     ,T10.SALESPERSON_NAME 
     ,T10.COMMISSION 
     ,T10.COMMISSION_DATE 
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY T5.CUSTOMER_ID ORDER BY T5.LEAD_CREATED_DATE ASC) AS RN 
       ,T5.* 
       ,T6.MAX_COMMISSION_DATE 
       ,DATEDIFF(DAY, T6.MAX_COMMISSION_DATE, T5.LEAD_CREATED_DATE) AS ANTAL_DAGE_SIDEN_SIDSTE_COMMISSION 
       ,CASE 
        WHEN DATEDIFF(DAY, T6.MAX_COMMISSION_DATE, T5.LEAD_CREATED_DATE) > 365  THEN 'YES' 
        ELSE 'NO' 
       END AS COMMISSION 
       ,CASE 
        WHEN DATEDIFF(DAY, T6.MAX_COMMISSION_DATE, T5.LEAD_CREATED_DATE) > 365  THEN T5.LEAD_CREATED_DATE 
        ELSE NULL 
       END AS COMMISSION_DATE 
     FROM  #LEADS AS T5 
      INNER JOIN (SELECT  T4.CUSTOMER_ID 
            ,MAX(T4.COMMISSION_DATE) AS MAX_COMMISSION_DATE 
         FROM  COMMISSION_CALCULATION AS T4 
         GROUP BY T4.CUSTOMER_ID) AS T6 ON T5.CUSTOMER_ID = T6.CUSTOMER_ID 
     WHERE T5.LEAD_ID NOT IN (SELECT LEAD_ID FROM COMMISSION_CALCULATION) 
     ) AS T10 
WHERE RN = 1 


) 
    SELECT * 
    FROM COMMISSION_CALCULATION; 
+1

प्लस 1 डेटा, कृपया अपने अपेक्षित परिणाम – TheGameiswar

+0

पोस्ट करें नमूना डेटा में अंतिम कॉलम वांछित परिणाम है। आपके समय के लिए शुक्रिया। –

+0

आपकी क्वेरी में कुछ समस्याएं हैं, क्या आप – TheGameiswar

उत्तर

0

मैं कुछ मान्यताओं जहां अपने विवरण पूरी तरह से के रूप में लिखा मतलब नहीं है बना दिया है, लेकिन नीचे अपनी वांछित परिणाम प्राप्त होता है:

if object_id('tempdb.dbo.#leads', 'u') is not null 
drop table #leads; 

create table #leads (lead_id int, customer_id int, lead_created_date datetime, salesperson_name varchar(20)) 
insert into #leads 
values (1, 1, '2013-09-01', 'rasmus') 
     ,(2, 1, '2013-11-01', 'christian') 
     ,(3, 1, '2014-01-01', 'nadja') 
     ,(4, 1, '2014-12-24', 'roar') 
     ,(5, 1, '2015-12-01', 'kristian') 
     ,(6, 2, '2014-01-05', 'knud') 
     ,(7, 2, '2015-01-02', 'rasmus') 
     ,(8, 2, '2015-01-08', 'roar') 
     ,(9, 2, '2016-02-05', 'kristian') 
     ,(10, 2, '2016-03-05', 'casper') 

if object_id('tempdb.dbo.#disered_result', 'u') is not null 
drop table #disered_result; 

create table #disered_result (lead_id int, desired_commision_result char(3)) 
insert into #disered_result 
values (1, 'yes'),(2, 'no'),(3, 'no'),(4, 'yes'),(5, 'no'),(6, 'yes'),(7, 'no'),(8, 'yes'),(9, 'yes'),(10, 'no') 

with rownum 
as 
(
    select row_number() over (order by customer_id, lead_created_date) as rn        -- This is to ensure an incremantal ordering id 
      ,lead_id 
      ,customer_id 
      ,lead_created_date 
      ,salesperson_name 
    from #leads 
) 
,cte 
as 
(
    select rn 
      ,lead_id 
      ,customer_id 
      ,lead_created_date 
      ,salesperson_name 
      ,'yes' as commission_result 
      ,lead_created_date as commission_window_start 
    from rownum 
    where rn = 1 

    union all 

    select r.rn 
      ,r.lead_id 
      ,r.customer_id 
      ,r.lead_created_date 
      ,r.salesperson_name 

      ,case when r.customer_id <> c.customer_id  -- If the customer ID has changed, we are at a new commission window. 
       then 'yes' 
       else case when r.lead_created_date > dateadd(d,365,c.commission_window_start) -- This assumes the window is 365 days and not one year (ie. Leap years don't add a day) 
         then 'yes' 
         else 'no' 
         end 
       end as commission_result 

      ,case when r.customer_id <> c.customer_id 
       then r.lead_created_date 
       else case when r.lead_created_date > dateadd(d,365,c.commission_window_start) -- This assumes the window is 365 days and not one year (ie. Leap years don't add a day) 
         then r.lead_created_date 
         else c.commission_window_start 
         end 
       end as commission_window_start 

    from rownum r 
     inner join cte c 
      on(r.rn = c.rn+1) 
) 
select lead_id 
     ,commission_result 
from cte 
order by customer_id 
     ,lead_created_date; 
नमूने के लिए
+0

समाधान बनाने के लिए समय निकालने के लिए धन्यवाद। समाधान वांछित परिणाम प्रदान करता है। मैं इसे अपने कमीशन गणना प्रोजेक्ट में लागू करने की आशा करता हूं, इसलिए देखें कि मेरे कर्सर आधारित समाधान से प्रदर्शन की तुलना कैसे की जाती है। –

संबंधित मुद्दे