0

ClusterID に基づいてレコードを結合して、顧客レコードのデータを充実させようとしています。

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

もつ:

ClusterID,CustomerNo,Name,Email,Mobile,Address,PostalCode,Passport,ProfileNo
100,NULL,Person,person@email.com,NULL,OfficeAdd,12345,NULL,123
100,456,Person,person@email.com,98765,HomeAdd,34567,P12345,NULL

**これは、SSIS DQS マッチング ノード ( https://ssisdqsmatching.codeplex.com/ ) の結果です。試合はできますが、ゴールデン レコードを取得するためのサバイバーシップ部分を処理することはできません。

欲しい:

ClusterID,CustomerNo,Name,Email,Mobile,Address,PostalCode,Passport,ProfileNo
100,456,Person,person@email.com,98765,OfficeAdd,12345,P12345,123

どんな考えでも大歓迎です。ありがとうございました!

4

2 に答える 2

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 ClusterID=@CLUSTERID
    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  @NCustomerNo=@CustomerNo
    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
于 2016-08-15T05:46:30.877 に答える