2016-10-11 8 views
0

У меня есть CTE, что дает мне результат из 760 строк. И у меня есть еще один оператор SELECT, который дает мне 722 строки. Я хочу посмотреть, какие записи существуют в CTE, которых нет в инструкции SELECT. Я использую оператор NOT EXISTS, но по какой-то причине он не дает мне никакого результата. Я также пробовал NOT IN - но то же самое ... нет записей.Как найти строки, которые не разделены между двумя запросами из одной исходной таблицы

;WITH Cte_Policies AS 
     (
     SELECT 
      PolicyNumber, 
      ControlNo, 
      EffectiveDate, 
      ExpirationDate, 
      ProducerName, 
      SUM(BOUND_Premium) as NetWrittenPremium 
     FROM CatalyticWindEQ 
     WHERE EffectiveDate >= '05-01-2016' AND EffectiveDate <= EOMONTH(GETDATE())  
       AND LineName = 'Earthquake' AND Underwriter <> 'Batcheller, Jerry' AND PolicyNumber IS NOT NULL 
     GROUP BY 

       ProducerName, 
       EffectiveDate 
       ,ExpirationDate ,PolicyNumber, ControlNo 
     ) 
SELECT PolicyNumber, 
     ControlNo, 
     YEAR(EffectiveDate) as PolicyEffectiveYear, 
     MONTH(EffectiveDate) as PolicyEffectiveMonth, 
     NetWrittenPremium, 
     ProducerName as Producer 


FROM 
    Cte_Policies 


    where 
    NOT EXISTS 

    (
     SELECT 
        PolicyNumber 
     FROM  CatalyticWindEQ eq 
     WHERE  EffectiveDate>='05-01-2016' AND EffectiveDate <= EOMONTH(GETDATE()) AND LineName = 'Earthquake' AND Underwriter <> 'Batcheller, Jerry' 
        AND PolicyNumber IS NOT NULL 
        and eq.PolicyNumber=Cte_Policies.PolicyNumber 
     GROUP BY PolicyNumber 
    ) 

enter image description here

Результат от КТРА только 760 строк выглядит следующим образом: enter image description here

И результат от ЗЕЬЕСТА, что дает 722 строк выглядит следующим образом: enter image description here

Я сделал это »

; with CTE as 
(
     SELECT 
      PolicyNumber, 
      ControlNo, 
      EffectiveDate, 
      ExpirationDate, 
      ProducerName, 
      SUM(BOUND_Premium) as NetWrittenPremium 
     FROM CatalyticWindEQ 
     WHERE EffectiveDate >= '05-01-2016' AND EffectiveDate <= EOMONTH(GETDATE())  
       AND LineName = 'Earthquake' AND Underwriter <> 'Batcheller, Jerry' AND PolicyNumber IS NOT NULL 
     GROUP BY 

       ProducerName, 
       EffectiveDate 
       ,ExpirationDate ,PolicyNumber, ControlNo 
     ) 
SELECT PolicyNumber, 

     min(tag) as min_tag, 
     max(tag) as max_tag 


FROM 
     (
     SELECT PolicyNumber, 1 as tag FROM CTE 
    UNION ALL 
     SELECT PolicyNumber, 2 as tag FROM CatalyticWindEQ 
     ) U 
GROUP BY PolicyNumber 
HAVING COUNT(*)=1 

И теперь у меня есть 888 строк с min_tag = 2 и max_tag = 2. Означает ли это, что каждый номер политики дублируется в моей исходной таблице? enter image description here

+0

не слишком хорошо знакомы с TSQL, но мог его быть GROUP BY в вашем предложении NOT EXISTS? Не похоже, что вы используете какую-либо агрегированную функцию, чтобы GROUP BY ничего не делал. – James

+0

Просто прокомментировал это и попытался снова, но проблема остается. Спасибо, хотя – Oleg

+1

['EXCEPT'] (https://msdn.microsoft.com/en-us/library/ms188055.aspx)? – HABO

ответ

0

Основная стратегия заключается в выборе обоих наборов данных (списки PolicyNumber), собирать их с помощью union all, и найти уникальные предметы в комбинации.

; with CTE as (...) -- the CTE from above 
Select PolicyNumber, min(tag) as min_tag, max(tag) as max_tag from (
    select PolicyNumber, 1 as tag from CTE 
    union all 
    select PolicyNumber, 2 as tag from CatalyticWindEQ -- the source you're matching 
) U 
Group by PolicyNumber 
Having count(*) =1 -- equivalently, having min(tag) = max(tag) 

Ряды, имеющие max(tag) = 1 только в КТР.

+0

Я сделал это. Теперь у меня есть 888 строк с min_tag = 2 и max_tag = 2. Значит ли это, что каждый номер политики в таблице «CatalyticWindEQ» повторяется дважды? – Oleg

+0

Я добавил результат выше – Oleg

+0

Если min_tag = 2, CTE не возвращает строку. Все 2 означает, что он находится во второй части инструкции 'union'. – cco

0

вы можете использовать полное внешнее соединение с флагом различия, после ввода вашего второго запроса в другой КТР, скажем cte2, вы можете попробовать что-то вроде этого:

select 
    a.PolicyNumber, 
    a.ControlNo, 
    a.YEAR(EffectiveDate) as PolicyEffectiveYear, 
    a.MONTH(EffectiveDate) as PolicyEffectiveMonth, 
    a.NetWrittenPremium, 
    a.ProducerName as Producer, 
    b.PolicyNumber 
from Cte_Policies as a 
full outer join cte2 as b ON b.PolicyNumber=a.PolicyNumber 
where 
     a.PolicyNumber is null -- will show records NOT in cte. 
    OR b.PolicyNumber is null -- Will show records NOT in cte2. 
+0

Он также дает мне пустой стол. Означает ли это, что у них обоих есть то же самое PolicyNember? – Oleg

+0

не получает записей, означает, что все номера политик являются общими для обеих сторон запроса. но поскольку у вас разные подсчеты для обоих запросов: cte и cte2, и вы делаете группировку, я думаю, у вас есть дубликат policyNumber. вам нужно дважды проверить. –