0

Я пытаюсь объединить записи на основе ClusterID, чтобы иметь обогащенные данные записей клиентов.Данные клиента и комбинации данных

Как я могу сгруппировать следующие данные с помощью MS SQL? Coalesce не будет работать, поскольку записи должны быть в одной строке, чтобы заставить ее работать, и если у меня больше двух совпадений на кластер, это будет утомительная обработка. Использование max по ClusterId во всех столбцах - это обходной путь, который я делаю, но я надеялся, что есть более эффективный способ сделать это.

Есть:

ClusterID,CustomerNo,Name,Email,Mobile,Address,PostalCode,Passport,ProfileNo 
100,NULL,Person,[email protected],NULL,OfficeAdd,12345,NULL,123 
100,456,Person,[email protected],98765,HomeAdd,34567,P12345,NULL 

** Это результат Matching узла SSIS DQS (https://ssisdqsmatching.codeplex.com/). Он может выполнять матч, но не может обработать часть выживания, чтобы получить золотую пластинку.

Хотите:

ClusterID,CustomerNo,Name,Email,Mobile,Address,PostalCode,Passport,ProfileNo 
100,456,Person,[email protected],98765,OfficeAdd,12345,P12345,123 

Любые мысли были бы оценены. Спасибо!

ответ

1
DECLARE @CLUSTERID VARCHAR(MAX),@CUSTOMERNO VARCHAR(MAX),@NAME VARCHAR(MAX),@EMAIL VARCHAR(MAX),@MOBILE VARCHAR(MAX) 
DECLARE @POSTALCODE VARCHAR(MAX),@PASSPORT VARCHAR(MAX),@PROFILENO VARCHAR(MAX),@ADDRESS VARCHAR(MAX) 

DECLARE @NCLUSTERID VARCHAR(MAX),@NCUSTOMERNO VARCHAR(MAX),@NNAME VARCHAR(MAX),@NEMAIL VARCHAR(MAX),@NMOBILE VARCHAR(MAX) 
DECLARE @NPOSTALCODE VARCHAR(MAX),@NPASSPORT VARCHAR(MAX),@NPROFILENO VARCHAR(MAX),@NADDRESS VARCHAR(MAX) 
DECLARE @NEW_TABLE TABLE ( ClusterID varchar(max) , 
    CustomerNo varchar(max) , 
    Name varchar(max) , 
    Email varchar(max) , 
    Mobile varchar(max) , 
    Address varchar(max) , 
    PostalCode varchar(max) , 
    Passport varchar(max) , 
    ProfileNo varchar(max) 
) 

DECLARE C CURSOR FOR 
SELECT DISTINCT CLUSTERID FROM CUSTOMER 
OPEN C 
FETCH NEXT FROM C INTO @CLUSTERID 
WHILE @@FETCH_STATUS=0 
BEGIN 

    DECLARE D CURSOR FOR 
    select CustomerNo,Name,Email,Mobile,Address,PostalCode,Passport,ProfileNo from customer where [email protected] 
    OPEN D 
    FETCH NEXT FROM D INTO @CustomerNo,@Name,@Email,@Mobile,@Address,@PostalCode,@Passport,@ProfileNo 
    WHILE @@FETCH_STATUS=0 
    BEGIN 

    IF @CustomerNo is not null SET @[email protected] 
    IF @CustomerNo IS NOT NULL SET @NCustomerNo= @CustomerNo ; 
    IF @Name  IS NOT NULL SET @NName  = @Name  ; 
    IF @Email  IS NOT NULL SET @NEmail  = @Email  ; 
    IF @Mobile  IS NOT NULL SET @NMobile = @Mobile  ; 
    IF @Address IS NOT NULL SET @NAddress = @Address ; 
    IF @PostalCode IS NOT NULL SET @NPostalCode= @PostalCode ; 
    IF @Passport IS NOT NULL SET @NPassport = @Passport ; 
    IF @ProfileNo IS NOT NULL SET @NProfileNo = @ProfileNo ; 

    FETCH NEXT FROM D INTO @CustomerNo,@Name,@Email,@Mobile,@Address,@PostalCode,@Passport,@ProfileNo 
    END 
    CLOSE D 
    DEALLOCATE D 
     INSERT INTO @NEW_TABLE VALUES (
     @CLUSTERID, 
     @NCustomerNo , 
     @NName   , 
     @NEmail  , 
     @NMobile  , 
     @NAddress  , 
     @NPostalCode , 
     @NPassport  , 
     @NPROFILENO  
     ) 



FETCH NEXT FROM C INTO @CLUSTERID 
END 
CLOSE C 
DEALLOCATE C 


SELECT * FROM @NEW_TABLE 
+0

Попробуйте это, я предполагаю, что это решает ваш вопрос –

+0

спасибо! Это то, что я ищу. Я исправлю, что он переходит в цикл для каждого ClusterID и затем заполняет поля, когда они не являются NULL? – mtryingtocode

+0

Кроме того, чтобы добавить какое-то усложнение в цикле, скажем, для поля адреса, адрес строки 1 не является нулевым, а почтовый - нулевым, то адрес строки 2 и почтовый индекс не являются нулевыми. Как добавить условие, чтобы я не принимал почтовый код во второй строке? Поскольку, если я получаю почтовый код в строке 2, он дает мне неправильную информацию уже в сочетании с адресом строки 1. – mtryingtocode

0

Я думаю, этот вопрос решает ваше требование

DECLARE @CLUSTERID VARCHAR(MAX),@CUSTOMERNO VARCHAR(MAX),@NAME VARCHAR(MAX),@EMAIL VARCHAR(MAX),@MOBILE VARCHAR(MAX) 
DECLARE @POSTALCODE VARCHAR(MAX),@PASSPORT VARCHAR(MAX),@PROFILENO VARCHAR(MAX),@ADDRESS VARCHAR(MAX) 

DECLARE @NCLUSTERID VARCHAR(MAX)=NULL,@NCUSTOMERNO VARCHAR(MAX)=NULL,@NNAME VARCHAR(MAX)=NULL,@NEMAIL VARCHAR(MAX)=NULL,@NMOBILE VARCHAR(MAX)=NULL 
DECLARE @NPOSTALCODE VARCHAR(MAX)=NULL,@NPASSPORT VARCHAR(MAX)=NULL,@NPROFILENO VARCHAR(MAX)=NULL,@NADDRESS VARCHAR(MAX)=NULL 
DECLARE @NEW_TABLE TABLE ( ClusterID varchar(max) , 
    CustomerNo varchar(max) , 
    Name varchar(max) , 
    Email varchar(max) , 
    Mobile varchar(max) , 
    Address varchar(max) , 
    PostalCode varchar(max) , 
    Passport varchar(max) , 
    ProfileNo varchar(max) 
) 

DECLARE C CURSOR FOR 
SELECT DISTINCT CLUSTERID FROM CUSTOMER 
OPEN C 
FETCH NEXT FROM C INTO @CLUSTERID 
WHILE @@FETCH_STATUS=0 
BEGIN 

    DECLARE D CURSOR FOR 
    select CustomerNo,Name,Email,Mobile,Address,PostalCode,Passport,ProfileNo from customer where [email protected] 
    OPEN D 
    FETCH NEXT FROM D INTO @CustomerNo,@Name,@Email,@Mobile,@Address,@PostalCode,@Passport,@ProfileNo 
    WHILE @@FETCH_STATUS=0 
    BEGIN 

    IF @CustomerNo is not null SET @[email protected] 
    IF @CustomerNo IS NOT NULL SET @NCustomerNo= @CustomerNo ; 
    IF @Name  IS NOT NULL SET @NName  = @Name  ; 
    IF @Email  IS NOT NULL SET @NEmail  = @Email  ; 
    IF @Mobile  IS NOT NULL SET @NMobile = @Mobile  ; 
    IF @Passport IS NOT NULL SET @NPassport = @Passport ; 
    IF @ProfileNo IS NOT NULL SET @NProfileNo = @ProfileNo ; 

    IF (@ADDRESS IS NOT NULL AND @NADDRESS IS NOT NULL) 
    BEGIN 
    SET @NAddress = @Address ; 
    SET @NPostalCode= @PostalCode ; 
    END 
    ELSE IF(@ADDRESS IS NOT NULL AND @NADDRESS IS NULL) 
    BEGIN 
    SET @NAddress = @Address ; 
    SET @NPostalCode= NULL ; 
    END 
    ELSE IF(@ADDRESS IS NULL AND @NADDRESS IS NOT NULL) 
    BEGIN 
    SET @NAddress = NULL ; 
    SET @NPostalCode= @PostalCode ; 
    END 


    FETCH NEXT FROM D INTO @CustomerNo,@Name,@Email,@Mobile,@Address,@PostalCode,@Passport,@ProfileNo 
    END 
    CLOSE D 
    DEALLOCATE D 

     INSERT INTO @NEW_TABLE VALUES (
     @CLUSTERID, 
     @NCustomerNo , 
     @NName   , 
     @NEmail  , 
     @NMobile  , 
     @NAddress  , 
     @NPostalCode , 
     @NPassport  , 
     @NPROFILENO  
     ) 



FETCH NEXT FROM C INTO @CLUSTERID 
END 
CLOSE C 
DEALLOCATE C 


SELECT * FROM @NEW_TABLE 

 Смежные вопросы

  • Нет связанных вопросов^_^