0

고객 레코드가 풍부한 데이터를 갖기 위해 ClusterID를 기반으로 레코드를 결합하려고합니다.고객 데이터 정리 및 결합

MS SQL을 사용하여 다음을 어떻게 그룹화 할 수 있습니까? Coalesce는 레코드가 동일한 행에 있어야 작동 할 수 있기 때문에 작동하지 않으며 클러스터 당 2 개 이상의 일치가 있으면 지루한 처리가됩니다. 모든 컬럼에서 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 

이 ** 이것은 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 주소가 null이 아니고 우편 번호가 null이고 행 2 주소 및 우편 번호가 null이 아니라고 가정 해 봅시다. 두 번째 줄에 우편 번호를 사용하지 않을 조건을 어떻게 추가 할 수 있습니까? 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