0

私は、顧客レコードの豊富なデータを持つためにClusterIDに基づいてレコードを結合しようとしています。顧客データの集計と組み合わせ

MS SQLを使用して以下のグループをどのようにグループ化できますか?合体はレコードを同じ行にして動作させる必要があるため動作しません。また、クラスタごとに2つ以上の一致があると、面倒な処理になります。すべての列でClusterIdのmaxを使用することは回避策ですが、これを行うための効率的な方法があることを期待していました。

は持っている:

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行目に郵便番号を記入しない条件を追加するにはどうすればよいですか? 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 
関連する問題