仕事中、私の課題の1つは、営業スタッフへの手数料を計算することです。 1つのルールは他のルールよりも困難です。再帰的なCTEを使用して日付ロジックを処理する
2つのセールスチームAとBがそれぞれ異なる製品を販売しています。チームAはチームBにリードを送ることができます。同じ顧客が複数回送信される可能性があります。リードを作成したチームAの営業担当者に初めて顧客(リード1など)*が手数料を送付します。これで、顧客は次の365日間(リード1が作成された日付から数えて)「ロック」されます。つまり、リードを追加することで、誰もその顧客の追加の手数料を得ることができないということです(リード2と3は手数料なし)。 365日が経過した後。新しいリードを作成し、手数料(リード4など)を受け取ることができます。その後、顧客はリード4が作成された日から数えて365日間再びロックされます。したがって、リード5は手数料がかかりません。難しいのは、365日をカウントした日付をリセットすることです。
'*テーブル#LEADSおよび#DISERED結果への参照。
私はカーソルを使ってtSQLの問題を解決しましたが、代わりに再帰的なCTEを使用できるかどうか疑問です。私はいくつかの試行を行いました。私の解決策の問題は、再帰テーブルを複数回参照していることです。私はCTE内のCTEを入れ子にしてこの問題を解決しようとしました。それは許可されていません。私はCTEの内部で一時テーブルを使用しようとしましたが、どちらも許可されていません。再帰テーブルが一度しか参照されないように、CTEの再帰的な部分を再コードするために何度か試してみましたが、その後ロジックを動作させることができません。
私が書かれたあなたの説明は完全に意味がありませんいくつかの仮定を行っているが、以下ご希望の結果実現しSQL 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