Повторяющиеся значения должны быть удалены при условиях - PullRequest
0 голосов
/ 12 мая 2018

У меня есть две таблицы IAM и IAM_audit, как показано ниже.Я пытаюсь получить результаты для номеров счетов, которые изменили страну или страну налогообложения.Это отлично работает.Однако я хочу, чтобы в результатах отображались только уникальные номера счетов, даже если они изменяются как в стране налогообложения, так и в стране.Я не хочу, чтобы номер счета 120 в этом примере отображался дважды?:) Есть ли способ.

Исходная таблица Создание:

create table #Iam_audit1
(
     accnum int,
     invnumber int,
     audit_field varchar(10),
     field_before varchar(10),
     field_after varchar(10),
     modified_date datetime
)

insert into #Iam_audit1 (accnum, invnumber, audit_field, field_before,field_after, modified_date)
values 
       (120, 131, 'country', 'US', 'CAN','2014-08-09'),
      (120, 131, 'taxcountry', 'US','CAN', '2015-07-09'),
       (121, 132, 'country', 'CAN','US', '2014-09-15'),
       (121, 132, 'taxcountry', 'CAN', 'US','2015-09-14'),
       (122, 133, 'Taxcountry','CAN','US','2014-05-27')


create table #Iam
(
      Accnum int,
      invnumber int,
      country varchar(10) ,
      Taxcountry varchar(10)
)


insert into #Iam (Accnum, invnumber, country, taxcountry)
values (120, 131, 'CAN', 'CAN'), 
(120, 132, 'US', 'US'),
(122, 133, 'CAN', 'CAN')

Основной запрос:

  Select distinct IAMA.accnum,
       IAMA.invnumber,
IAM.taxcountry,
Iama.audit_field,
IAM.country
From #iam_audit1 IAMA
join #IAM iam on  iam.Accnum = iama.Accnum 
                                  AND iam.invnumber = iama.invnumber
Where Audit_Field IN ('TaxCountry', 'Country')
AND         (
         (isnull(Field_Before,'CAN') <> 'CAN' AND isnull(Field_After,'CAN') = 'CAN')
         OR (isnull(Field_Before,'CAN') = 'CAN' AND isnull(Field_After,'CAN') <> 'CAN')
        )    

Текущие результаты

accnum  invnumber   taxcountry  audit_field country
120     131            CAN        country        CAN
120     131            CAN        taxcountry    CAN
122     133            CAN        Taxcountry    CAN

Ожидаемые результаты:

   accnum   invnumber   taxcountry  audit_field country
    120     131            CAN        country        CAN
    122     133            CAN        Taxcountry    CAN

1 Ответ

0 голосов
/ 12 мая 2018

Пока audit_field находится в предложении select, у вас будут дубликаты.После рефакторинга исходного запроса вы можете видеть, что это единственное поле, которое может вызвать дубликаты, если ваша таблица #IAM имеет уникальные номера счетов, т.е. accnum.Это связано с тем, что все остальные столбцы в предложении select могут быть из таблицы #IAM.

select distinct
      IAM.accnum
    , IAM.invnumber
    , IAM.taxcountry
    , IAMA.audit_field -- causing the 'duplicates' you describe
    , IAM.country
from
    #iam_audit1 IAMA
join
    #IAM IAM
    on 
        IAM.Accnum = IAMA.Accnum 
        and
        IAM.invnumber = IAMA.invnumber
where
    IAMA.Audit_Field IN ('TaxCountry', 'Country')
    and (
            (isnull(IAMA.Field_Before,'CAN') <> 'CAN' and isnull(IAMA.Field_After,'CAN') = 'CAN')
            or
            (isnull(IAMA.Field_Before,'CAN') = 'CAN' and isnull(IAMA.Field_After,'CAN') <> 'CAN')
        )

В зависимости от ваших конкретных требований к использованию (и версии SQL Server), есть несколько различных обходных путей, которые вы можете попробовать, если вы действительно не хотите использовать несколько записей для одного номера учетной записи.

Во-первых, вы можете просто удалить audit_field из предложения select.

select distinct
      IAM.accnum
    , IAM.invnumber
    , IAM.taxcountry
    , IAM.country
from
    #iam_audit1 IAMA
join
    #IAM IAM
    on 
        IAM.Accnum = IAMA.Accnum 
        and
        IAM.invnumber = IAMA.invnumber
where
    IAMA.Audit_Field IN ('TaxCountry', 'Country')
    and (
            (isnull(IAMA.Field_Before,'CAN') <> 'CAN' and isnull(IAMA.Field_After,'CAN') = 'CAN')
            or
            (isnull(IAMA.Field_Before,'CAN') = 'CAN' and isnull(IAMA.Field_After,'CAN') <> 'CAN')
        )

, который производит

accnum  invnumber   taxcountry  country
120     131         CAN         CAN
122     133         CAN         CAN

Во-вторых, вы можете получить номер счета и количество различныхAudit_fields, которые изменились.

select distinct
      IAM.accnum
    , IAM.invnumber
    , IAM.taxcountry
    , count(distinct IAMA.audit_field) as cnt_audits_with_changes
    , IAM.country
from
    #iam_audit1 IAMA
join
    #IAM IAM
    on 
        IAM.Accnum = IAMA.Accnum 
        and
        IAM.invnumber = IAMA.invnumber
where
    IAMA.Audit_Field IN ('TaxCountry', 'Country')
    and (
            (isnull(IAMA.Field_Before,'CAN') <> 'CAN' and isnull(IAMA.Field_After,'CAN') = 'CAN')
            or
            (isnull(IAMA.Field_Before,'CAN') = 'CAN' and isnull(IAMA.Field_After,'CAN') <> 'CAN')
        )
group by
      IAM.accnum
    , IAM.invnumber
    , IAM.taxcountry
    , IAM.country

, который производит

accnum  invnumber   taxcountry  cnt_audits_with_changes country
120     131         CAN         2                       CAN
122     133         CAN         1                       CAN

В-третьих, если вы используете SQL Server 2017 или более позднюю версию, вы можете использовать функцию агрегат строк для объединенияaudit_fields

select distinct
      IAM.accnum
    , IAM.invnumber
    , IAM.taxcountry
    , string_agg(IAMA.audit_field, ', ') as list_audits_with_changes
    , IAM.country
from
    #iam_audit1 IAMA
join
    #IAM IAM
    on 
        IAM.Accnum = IAMA.Accnum 
        and
        IAM.invnumber = IAMA.invnumber
where
    IAMA.Audit_Field IN ('TaxCountry', 'Country')
    and (
            (isnull(IAMA.Field_Before,'CAN') <> 'CAN' and isnull(IAMA.Field_After,'CAN') = 'CAN')
            or
            (isnull(IAMA.Field_Before,'CAN') = 'CAN' and isnull(IAMA.Field_After,'CAN') <> 'CAN')
        )
group by
      IAM.accnum
    , IAM.invnumber
    , IAM.taxcountry
    , IAM.country

, который производит

accnum  invnumber   taxcountry  list_audits_with_changes    country
120     131         CAN         country, taxcountry         CAN
122     133         CAN         taxcountry                  CAN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...