Исключить отрицательные значения, которые имеют одинаковые абсолютные значения - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть таблица ниже

PolicyNumber    Premium Commission  DataSource  EffectiveDate
1              -2.25    -0.41       Internal    31/03/2018
1               160.26  29.14       Internal    31/03/2018
1                98.81  17.96       Internal    31/03/2018
2              361.24   65.67       Internal    31/01/2018
2              570.35   103.70      Internal    31/01/2018
2              -17.05   -3.10       Internal    31/01/2018
3              240.60   0.00        External    31/01/2018
3             196.64    0.00        External    31/01/2018
3             240.60    0.00        External    31/01/2018
3              196.64   0.00        External    31/01/2018
3              -240.60  0.00        External    28/02/2018
3            -196.64    0.00        External    28/02/2018
3            -240.60    0.00        External    28/02/2018
3            -196.64    0.00        External    28/02/2018
3             224.04    107.54      External    28/02/2018
3              176.97   84.95       External    28/02/2018
4             504.00    0.00        External    31/01/2018
4              68.33    0.00        External    31/01/2018
4              504.00   0.00        External    31/01/2018
4              68.33    0.00        External    31/01/2018
4            -504.00    0.00        External    28/02/2018
4             -68.33    0.00        External    28/02/2018
4            -504.00    0.00        External    28/02/2018
4             -68.33    0.00        External    28/02/2018
4             453.55    217.70      External    28/02/2018
4              61.44    29.49       External    28/02/2018

Мне нужно исключить все отрицательное значение премии, которое имеет такое же абсолютное значение из предыдущего. Например, PolicyNumber 3, Premium 240.60 и 196.64 корректируются на отрицательное значение премии -240,60 и -196,64. Мне нужно исключить PolicyNumber 3.

Я ожидаю получить конечный результат, как показано в таблице ниже.

PolicyNumber    Premium Commission  DataSource  EffectiveDate
1               -2.25   -0.41       Internal    31/03/2018
1               160.26  29.14       Internal    31/03/2018
1               98.81   17.96       Internal    31/03/2018
2               361.24  65.67       Internal    31/01/2018
2               570.35  103.70      Internal    31/01/2018
2               -17.05  -3.10       Internal    31/01/2018

Я пробовал запрос ниже, но он не дает мне то, что я ожидаю

    with cte as 
    ( select distinct a.PolicyNumber, a.datasource, a.EffectiveDate from InsuranceTable a 

inner join (select PolicyNumber, premium, EffectiveDate, datasource 

    from InsuranceTable) b on a.PolicyNumber = b.PolicyNumber  

    where a.premium < 0 and a.EffectiveDate = b.EffectiveDate and a.datasource = b.datasource and b.premium > 0   ) 

select x.PolicyNumber, x.premium, x.EffectiveDate, x.Commission, x.datasource from InsuranceTable x 
inner join cte y on x.PolicyNumber = y.PolicyNumber and x.datasource = y.datasource 
order by x.PolicyNumber, x.EffectiveDate

Я использую Microsoft SQL Server 2012. Спасибо всем за помощь.

1 Ответ

0 голосов
/ 30 апреля 2018

CTE ниже находит все политики, имеющие премию, которая в точности отменяется отрицательной премией на ту же сумму. Это достигается путем агрегирования по политике и абсолютной стоимости премии. Тогда нам нужен только очень простой запрос для получения политик, которые вы хотите просмотреть.

WITH cte AS (
    SELECT DISTINCT PolicyNumber
    FROM InsuranceTable
    GROUP BY PolicyNumber, ABS(Premium)
    HAVING COUNT(*) > 1 AND MAX(Premium) <> MIN(Premium)
)

SELECT t1.*
FROM InsuranceTable t1
WHERE NOT EXISTS (SELECT 1 FROM cte t2 WHERE t1.PolicyNumber = t2.PolicyNumber);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...