Untitled

mail@pastecode.io avatar
unknown
plain_text
a month ago
16 kB
1
Indexable
Never
----Конечные клиенты дилеров---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

--Ранжирование конечных клиентов дилеров
	DROP TABLE IF EXISTS #cll
	SELECT DISTINCT 
		cl.agent_inn, 
		cl.agent_name, 
		cl.client_inn, 
		cl.client_name, 
		contract_date_begin, 
		contract_name
	INTO #cll
	FROM [DATAMARTS].[dpa].[vw_clients] cl -- справочник клиентов
	
	
	--SELECT TOP 10 * FROM #cll
	--SELECT TOP 10 * FROM [DATAMARTS].[dpa].[vw_clients]
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
----Транзакции конечных клиентов дилеров	(с фильтром на последнюю продажу)  

--	DROP TABLE IF EXISTS #vtt
--	SELECT 
--		vt.client_inn, 
--		vt.agent_inn, --UPD Добавил Антон
--		vt.contract_name, 
--		vt.region, 
--		CAST(MAX(vt.datetime_trn)OVER(PARTITION BY vt.client_inn,vt.contract_name) AS DATE) AS MAX_DOC_date -- для каждой пары client_inn и contract_name берем макс знач datetime_trn, приводится к date и назначается MAX_DOC_date
--	INTO #vtt
--	FROM [DATAMARTS].[dpa].vw_transactions vt -- продажи конечных клиентов 
--	GROUP BY vt.datetime_trn, vt.client_inn, vt.agent_inn, vt.contract_name, vt.region

DROP TABLE IF EXISTS #vtt;

SELECT 
    vt.client_inn, 
    vt.agent_inn,
    vt.contract_name, 
    vt.region,
    DATEFROMPARTS(YEAR(vt.datetime_trn), MONTH(vt.datetime_trn), 1) AS transaction_date, -- Дата первого дня месяца транзакции
    SUM(cast(vt.litres AS decimal(10,2))) AS monthly_litres, -- Суммарное количество литров за месяц для каждой пары клиент-агент
    MAX(vt.datetime_trn) AS MAX_DOC_date -- Максимальная дата транзакции для каждой пары клиент-контракт
INTO #vtt
FROM [DATAMARTS].[dpa].vw_transactions vt
GROUP BY 
	vt.client_inn,
    vt.agent_inn,
    vt.contract_name, 
    vt.region,
	YEAR(vt.datetime_trn),
	MONTH(vt.datetime_trn);

	SELECT count(*) FROM #vtt
	--SELECT TOP 10 * FROM [DATAMARTS].[dpa].vw_transactions

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	DROP TABLE IF EXISTS #vttr

	SELECT 
		t.client_inn, 
		t.agent_inn, --upd: t.agent_inn добавил
		t.contract_name, 
		t.region, 
		t.transaction_date,
		SUM(t.monthly_litres) AS total_monthly_litres,
		cast(t.MAX_DOC_date AS date) AS MAX_DOC_date
	INTO #vttr
	FROM #vtt t
	GROUP BY 
		t.client_inn, 
		t.agent_inn, 
		t.contract_name, 
		t.region, 
		t.transaction_date,
		MAX_DOC_date

	SELECT count(*) FROM #vttr
	--SELECT TOP 10 * FROM #vttr
	--SELECT * FROM #vttr WHERE client_inn = '6671328672'

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--Продаж конечных клиентов и справочника договоров

    DROP TABLE IF EXISTS #dll
	SELECT 
		cll.agent_inn, 
		cll.agent_name, 
		vttr.client_inn, 
		cll.client_name, 
		vttr.region,
		cll.contract_name, 
		CAST(cll.contract_date_begin AS DATE) AS MIN_DOC_date, 
		vttr.MAX_DOC_date,
		vttr.transaction_date,
		vttr.total_monthly_litres
	INTO #dll
	FROM #vttr vttr 
	LEFT JOIN #cll cll ON cll.client_inn = vttr.client_inn and lower(cll.contract_name)=lower(vttr.contract_name)
	GROUP BY 
		cll.agent_inn, 
		cll.agent_name, 
		vttr.client_inn, 
		cll.client_name, 
		vttr.region,
		cll.contract_name, 
		cll.contract_date_begin, 
		vttr.MAX_DOC_date,
		vttr.transaction_date,
		vttr.total_monthly_litres;


	SELECT count(*) FROM #dll --552774
	SELECT count(DISTINCT agent_inn) FROM #dll --46 агентов
	SELECT count(DISTINCT client_inn) FROM #dll --16254 клиентов


---------- проверка на NULL----------
--SELECT count(*) --164234
--FROM #dll
--WHERE agent_inn IS NULL
--	OR agent_name IS NULL
--	OR client_name IS NULL 
--	OR contract_name IS NULL
--  OR MIN_DOC_date IS NULL
--	OR MAX_DOC_date IS NULL
--	OR region IS NULL
------------------------------------------------


 --   DROP TABLE IF EXISTS #dll_2
	--SELECT 
	--	agent_inn, 
	--	agent_name, 
	--	client_inn, 
	--	client_name, 
	--	region,
	--	contract_name,
	--	SUM(total_monthly_litres) AS total_litres,
	--	MIN(MIN_DOC_date) AS MIN_DOC_date, 
	--	MAX(MAX_DOC_date) AS MAX_DOC_date
	--INTO #dll_2
	--FROM #dll
	--GROUP BY 
	--	agent_inn, 
	--	agent_name, 
	--	client_inn, 
	--	client_name, 
	--	region,
	--	contract_name;

--SELECT TOP 10 * FROM #dll_2
--SELECT count(*) FROM #dll
--SELECT count(*) FROM #dll_2

--SELECT count(DISTINCT client_inn) FROM #dll
--SELECT count(DISTINCT client_inn) FROM #dll_2

--SELECT count(DISTINCT agent_inn) FROM #dll
--SELECT count(DISTINCT agent_inn) FROM #dll_2

 --анализируемые инн, по которым прошли транзакции по топливным картам юридических лиц РФ у наших клиентов из [VW_REALIZACIYA_FULL_KP] за 2023 год 
	 DROP TABLE IF EXISTS #wee;
	 SELECT 
		s.KONTRAGENT_INN, 
		s.KONTRAGENT_NAIMENOVANIE, 
		s.KOLICHESTVO_L,
		DATEFROMPARTS(YEAR(s.DATA_OPERACII), MONTH(s.DATA_OPERACII), 1) AS DATA_OPERACII,
		s.DOGOVORKONTRAGENTA_DATA_DOGOVORA, 
		s.DOGOVORKONTRAGENTA_NOMER_DOGOVORA, 
		s.DOGOVORKONTRAGENTA_ID_ASKU, 
		MAX(s.DATA_OPERACII)OVER(PARTITION BY KONTRAGENT_INN,DOGOVORKONTRAGENTA_NOMER_DOGOVORA) AS MAX_DOC_DATE_KK
	 INTO #wee
	 FROM [DATAMARTS].[KA].[VW_REALIZACIYA_FULL_KP] s
	 WHERE YEAR(DATA_OPERACII)='2023' -- DATA_OPERACII>='2023-07-01' and DATA_OPERACII<='2023-12-31'
	 AND KOLICHESTVO_L>0

	 
	 SELECT TOP 10 * FROM [DATAMARTS].[KA].[VW_REALIZACIYA_FULL_KP]

	 SELECT TOP 10 * FROM #wee
	 SELECT count(*) FROM #wee --71928922
	 SELECT * FROM #wee WHERE #wee.KONTRAGENT_INN='5074068130'
								

	 --SELECT DISTINCT NOMENKLATURNAYA_GRUPPA_KRATKO FROM [DATAMARTS].[KA].[VW_REALIZACIYA_FULL_KP]
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	
	DROP TABLE IF EXISTS #wwe
	 SELECT 
		a.KONTRAGENT_INN, 
		a.KONTRAGENT_NAIMENOVANIE,
		a.DOGOVORKONTRAGENTA_DATA_DOGOVORA, 
		a.DOGOVORKONTRAGENTA_NOMER_DOGOVORA, 
		a.DOGOVORKONTRAGENTA_ID_ASKU, 
		DATA_OPERACII,
		SUM(KOLICHESTVO_L) as TOTAL_LITRES
	 INTO #wwe
	 FROM #wee a
	 GROUP BY 
		a.KONTRAGENT_INN, 
		a.KONTRAGENT_NAIMENOVANIE, 
		a.DOGOVORKONTRAGENTA_DATA_DOGOVORA, 
		a.DOGOVORKONTRAGENTA_NOMER_DOGOVORA, 
		a.DOGOVORKONTRAGENTA_ID_ASKU, 
		a.DATA_OPERACII 

	 SELECT TOP 10 * FROM #wwe
	 SELECT count(*) FROM #wwe --659547
	 SELECT * FROM #wwe WHERE KONTRAGENT_INN='5074068130'

-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
	 DROP TABLE IF EXISTS #reg --существующие клиенты наши (пропусков в данных нет)
	 SELECT 
		w.KONTRAGENT_INN, 
		w.KONTRAGENT_NAIMENOVANIE, 
		w.DOGOVORKONTRAGENTA_DATA_DOGOVORA, 
		w.DOGOVORKONTRAGENTA_NOMER_DOGOVORA, 
		r.c_description AS OTDELENIE, 
		w.DATA_OPERACII,
		cast(w.TOTAL_LITRES AS decimal(19,2)) AS TOTAL_LITRES
	 INTO #reg
	 FROM #wwe w
	 LEFT JOIN  [asku_rp_kk_cdd].[cdd].[counterparty_contract] cc ON w.DOGOVORKONTRAGENTA_ID_ASKU = cc.id_rref --контракт
	 LEFT JOIN  [asku_kp_cdd].[cdd].[organization_department] r  ON cc.organization_department_rref=r.id_rref --регион объекта управления

	--SELECT TOP 10 * FROM [asku_kp_cdd].[cdd].[organization_department]
	--SELECT TOP 10 * FROM [asku_rp_kk_cdd].[cdd].[counterparty_contract]
	
	SELECT count(*) FROM #reg --659547
	SELECT count(DISTINCT KONTRAGENT_INN) FROM #reg --65256


	SELECT TOP 5 * FROM #reg WHERE #reg.KONTRAGENT_INN='2222874370'
-------------------------------------------------------------------------------------------------------------------------------------------------
	-- Создаем таблицу с клиентами, которые есть и у дилеров, и в VW_REALIZACIYA_FULL_KP за 2023 год
DROP TABLE IF EXISTS #CommonClients_KP;
SELECT 
    dl.agent_inn AS agent_inn_dil,
    dl.client_inn AS client_inn_dil,
	lower(dl.client_name) AS client_name_dil,
	dl.total_monthly_litres AS monthly_litres_dil,
	lower(r.KONTRAGENT_NAIMENOVANIE) AS client_name_GZPN,
	r.TOTAL_LITRES AS monthly_litres_GZPN,
	r.DATA_OPERACII AS transaction_date

INTO #CommonClients_KP
	FROM #dll dl
INNER JOIN #reg r 
	ON dl.client_inn = r.KONTRAGENT_INN AND dl.transaction_date=r.DATA_OPERACII 

SELECT TOP 10 * FROM #CommonClients_KP
---- Всего строк (9574 клиентов)
SELECT count(*) FROM #CommonClients_KP
---- Подсчет количества уникальных агентов (33 агента)
SELECT COUNT(DISTINCT agent_inn_dil) FROM #CommonClients_KP;
---- Подсчет количества уникальных клиентов (467 клиентов)
SELECT COUNT(DISTINCT client_inn_dil) FROM #CommonClients_KP;

--SELECT min(transaction_date) FROM #dll --2017-05-01
--SELECT min(DATA_OPERACII) FROM #reg --2023-01-01

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--ОКВЭДЫ
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
--SELECT TOP 10 * FROM [SANDBOX_DB_TEAM_21].[dbo].[Med_Okved] -- таблица с оквэдами

DROP TABLE IF EXISTS #KP_CommonClientsOkved_KP; -- подтягиваем оквэды к таблице с клиентами, которые есть и у нас, и у дилеров
SELECT 
	ccl.transaction_date,
	ccl.agent_inn_dil, 
	ccl.client_inn_dil, 
	ccl.client_name_dil,
	ccl.monthly_litres_dil,
	ccl.client_name_GZPN,
	ccl.monthly_litres_GZPN,
	okved.[ИНДЕКС]

INTO #KP_CommonClientsOkved_KP
FROM #CommonClients_KP ccl
LEFT JOIN [SANDBOX_DB_TEAM_21].[dbo].[Med_Okved] okved 
	ON ccl.client_inn_dil=okved.[ИНН]
GROUP BY 
	ccl.agent_inn_dil,
	ccl.client_inn_dil, 
	ccl.client_name_dil, 
	ccl.client_name_GZPN, 
	okved.[ИНДЕКС],
	transaction_date,
	monthly_litres_dil,
	monthly_litres_GZPN


SELECT count(client_inn_dil) FROM #KP_CommonClientsOkved_KP --9498 строк

SELECT count(DISTINCT client_inn_dil) FROM #KP_CommonClientsOkved_KP -- 467 уникальных инн

SELECT count(*) FROM #KP_CommonClientsOkved_KP WHERE agent_inn_dil IS NULL OR client_name_dil IS NULL -- 3407 пропусков в данных

-------------------- попробуем восстановить--------------------

-- сперва agent_inn--

-- Шаг 1: Определение уникальных пар client_inn и agent_inn для каждого клиента уникальные агенты
WITH UniqueAgentPairs AS (
    SELECT 
        client_inn, 
        agent_inn
    FROM #vttr
    GROUP BY client_inn, agent_inn
),
-- Шаг 2: Подсчет количества уникальных agent_inn для каждого client_inn
UniqueAgentCount AS (
    SELECT 
        client_inn,
        COUNT(agent_inn) AS UniqueAgentCount
    FROM UniqueAgentPairs
    GROUP BY client_inn
    HAVING COUNT(agent_inn) = 1 -- Выбор client_inn с одним уникальным agent_inn - уникальное соотвествие 
),
-- Шаг 3: Подготовка к обновлению, выборка нужных client_inn и соответствующих им agent_inn
AgentsToUpdate AS (
    SELECT 
        uac.client_inn,
        uap.agent_inn
    FROM UniqueAgentCount uac
    JOIN UniqueAgentPairs uap ON uac.client_inn = uap.client_inn
)
-- Обновление #KP_CommonClientsOkved_KP
UPDATE kpc
SET kpc.agent_inn_dil = atu.agent_inn
FROM #KP_CommonClientsOkved_KP kpc
JOIN AgentsToUpdate atu ON kpc.client_inn_dil = atu.client_inn
WHERE kpc.agent_inn_dil IS NULL;
--(2399 rows affected)

---- проверка 
--SELECT * FROM #KP_CommonClientsOkved_KP WHERE #KP_CommonClientsOkved_KP.client_inn_dil = '7733811690'
--SELECT * FROM #vttr WHERE #vttr.client_inn = '7733811690'
---- вроде ок

-- теперь client_name_dil--тут чуть проще, так как связь однозначная

UPDATE kpc
SET kpc.client_name_dil = reg.KONTRAGENT_NAIMENOVANIE
FROM #KP_CommonClientsOkved_KP kpc
INNER JOIN #reg reg ON kpc.client_inn_dil = reg.KONTRAGENT_INN
WHERE kpc.client_name_dil IS NULL
--(3407 rows affected)

-- проверка 
--SELECT * FROM #KP_CommonClientsOkved_KP WHERE #KP_CommonClientsOkved_KP.client_inn_dil = '7733811690'
--SELECT * FROM #reg WHERE #reg.KONTRAGENT_INN = '7733811690'
-- вроде ок

-- добавим информацию по ОКВЭДАМ из [SANDBOX_DB_TEAM_21].[dbo].[GEN_OKVED]

--проверка сколько совпадающих инн есть между таблицами
--SELECT count(*) AS matching_inn
--FROM #KP_CommonClientsOkved_KP AS kpc
--INNER JOIN [SANDBOX_DB_TEAM_21].[dbo].[GEN_OKVED] AS go
--ON kpc.client_inn_dil = go.INN;
--8994

 --хочу заменить пропуски в ИНДЕКС на значения из NAIMENOVANIE_OKVED для соответствующих инн-----------------------------------------------------
UPDATE kpc
SET kpc.ИНДЕКС = go.NAIMENOVANIE_OKVED
FROM #KP_CommonClientsOkved_KP AS kpc
INNER JOIN [SANDBOX_DB_TEAM_21].[dbo].[GEN_OKVED] AS go
    ON kpc.client_inn_dil = go.INN
WHERE go.VID_OKVED = 'Основной' 
  AND kpc.ИНДЕКС IS NULL;
--(2033 rows affected)

-- хочу заменить ИНДЕКС, который был добавленен из [Med_Okved] на описание из [GEN_OKVED], так как оно кажется более полным
UPDATE kpc
SET kpc.ИНДЕКС = go.NAIMENOVANIE_OKVED
FROM #KP_CommonClientsOkved_KP AS kpc
INNER JOIN [SANDBOX_DB_TEAM_21].[dbo].[GEN_OKVED] AS go
    ON kpc.client_inn_dil = go.INN
WHERE kpc.ИНДЕКС IS NULL OR kpc.ИНДЕКС <> go.NAIMENOVANIE_OKVED; -- обновляем только если ИНДЕКС пустой или отличается от NAIMENOVANIE_OKVED
--(6961 rows affected)
------------------------------------------
SELECT * FROM #KP_CommonClientsOkved_KP
GROUP BY #KP_CommonClientsOkved_KP.transaction_date

-- валидация на ложную подстановку--
SELECT * 
FROM #KP_CommonClientsOkved_KP
WHERE client_name_dil != lower(client_name_GZPN)
--0 несовпадений--

DROP TABLE IF EXISTS #final_KP

SELECT
	transaction_date,
	agent_inn_dil,
	client_inn_dil,
	client_name_dil,
	SUM(monthly_litres_dil) AS total_monthly_litres_dil,
	SUM(monthly_litres_GZPN) AS total_monthly_litres_GZPN,
	ИНДЕКС
FROM #KP_CommonClientsOkved_KP
GROUP BY transaction_date, agent_inn_dil, client_inn_dil, client_name_dil, ИНДЕКС

SELECT * FROM #final_KP
Leave a Comment