को संभालने के लिए रिकर्सिव सीटीई का उपयोग करें काम पर, मेरे असाइनमेंट में से एक बिक्री कर्मचारियों को कमीशन की गणना करना है। एक नियम दूसरों की तुलना में अधिक चुनौतीपूर्ण रहा है।दिनांक तर्क
दो बिक्री टीम ए और बी प्रत्येक बिक्री के विभिन्न उत्पादों को एक साथ काम करते हैं। टीम ए टीम बी को लीड भेज सकता है। वही ग्राहक कई बार भेज सकता है। पहली बार एक ग्राहक (पूर्व लीड 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 डेटा, कृपया अपने अपेक्षित परिणाम – TheGameiswar
पोस्ट करें नमूना डेटा में अंतिम कॉलम वांछित परिणाम है। आपके समय के लिए शुक्रिया। –
आपकी क्वेरी में कुछ समस्याएं हैं, क्या आप – TheGameiswar