Получить лучшее совпадение для объединения в MS SQL - PullRequest
0 голосов
/ 05 октября 2018

Я хочу получить результаты SQL-запроса Ms, отсортированные по наилучшему совпадению.Это означает, что у меня есть две таблицы, подобные этой

CREATE TABLE #Leads(
    Id          INT IDENTITY(1,1),
    LeadId      INT,
    PlanId      INT,
    RegionCode  VARCHAR(20),
    FuelType    VARCHAR(20)
)

CREATE TABLE #Discounts(
    Id              INT IDENTITY(1,1),
    PlanId          INT,
    RegionCode      VARCHAR(20),
    FuelType        VARCHAR(20),
    DiscountPercent DECIMAL(6,3)
)

И эти таблицы имеют следующие значения, как показано ниже

INSERT INTO #Leads([LeadId], [PlanId], [RegionCode], [FuelType])
    VALUES (1,1,'HR26', 'Petrol'),  
           (2,2,'HR30', 'Diesel')

INSERT INTO #Discounts ([PlanId], [RegionCode], [FuelType], [DiscountPercent])
                VALUES (1, null, null, 20),
                       (2, null, null, 10),
                       (2, 'HR30', null, 15),
                       (2, null, 'Diesel', 20),
                       (2, 'HR30', 'Diesel', 25)

Так что, если мы объединяем #leads таблицы с #discounts таблицей PlanId затем -

для Plan 1 у нас нет нескольких записей о скидках, поэтому мы выберем первую, это будет 20%

, но для Плана 2 мы получаем данные как: -

Случай 1: У нас есть несколько записей скидок для Плана 2, теперь для текущего случая он должен выбрать 25%, потому что RegionCode и FuelType оба соответствуют свинцу.

Случай 2: Если я обновлю Plan 2 отвести и изменим RegionCode to NULL (или любое значение, которое не совпадает в таблице скидок для Plan 2), тогда следует выбрать 20%.

Случай 3: Если я обновлю Plan 2 lead и изменим FuelType to NULL (или любое значение, которое не совпадает в таблице скидок для Plan 2) и RegionCode обратно на HR30, тогда он долженвыберите 15%

Случай 4: Если я изменю их оба на NULL (или любое значение, которое не совпадает в таблице скидок для Plan 2) тогда следует выбрать 10%.

Я хочу наилучшее из возможных совпадений для Plan2

Я не знаю, как написать запрос для этого, пожалуйста, помогите - заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 05 октября 2018

Может быть, я могу помочь из моего опыта.Но я могу помочь только запросом по каждому делу.

Дело 1:

SELECT * FROM #Leads l INNER JOIN #Discounts d ON l.PlanId = d.PlanId AND l.RegionCode = d.RegionCode and l.FueLType = d.FuelType

Дело 2:

SELECT * FROM #Leads l INNER JOIN #Discounts d ON l.PlanId = d.PlanId AND l.FuelType = d.FuelType

Дело 3:

SELECT * FROM #Leads l INNER JOIN #Discounts d ON l.PlanId = d.PlanId AND l.RegionCode= d.RegionCode

Дело 4:

SELECT * FROM #Leads l INNER JOIN #Discounts d ON l.PlanId = d.PlanId

Это все, что я могу помочь.Может быть, это может дать вам какую-то идею или что-то.И может быть, кто-то более опытный может помочь.Гудлак!

0 голосов
/ 05 октября 2018

Попробуйте это:

select * from #Leads l  
join #Discounts d  
   on d.PlanId=l.PlanId  
   and d.[DiscountPercent]=(select max([DiscountPercent]) from #Discounts 
                          where PlanId=l.PlanId 
                          and ((FuelType=l.FuelType and RegionCode=l.RegionCode)
                            or (FuelType=l.FuelType and RegionCode is null)
                            or (FuelType is null and RegionCode=l.RegionCode)
                            or (FuelType is null and RegionCode is null)))
0 голосов
/ 05 октября 2018

Предполагая, что я понимаю вопрос, вот один из способов сделать это:

;WITH CTE AS
(
SELECT  LeadID, 
        (
        CASE WHEN l.RegionCode = d.RegionCode THEN 1 ELSE 0 END
        + CASE WHEN l.FuelType = d.FuelType THEN 1 ELSE 0 END
        -- + more of the same here
        ) As Match,    
        d.DiscountPercent
FROM #Leads As l
JOIN #Discounts As d
    ON l.PlanId = d.PlanId
)

SELECT TOP 1 WITH TIES LeadID, DiscountPercent
FROM CTE
ORDER BY ROW_NUMBER() OVER(PARTITION BY LeadID ORDER BY Match DESC)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...