Пока 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