1

フォームから入力された情報を取得する顧客というテーブルがあり、すべてのフィールドが必要なわけではありません (これは、フォームが入力された情報を使用して asf / xml を生成するためです)、重複を 1 つの行にマージして重複を削除できるようにしたいと考えています。 .

これが私のテーブルです

CID | LastName | FirstName | Street | City | ZipCode | HomePhone | CellPhone | EmailAddr
 1     Test       NULL         NULL   NULL   NULL       NULL        NULL         NULL
 2     NULL       TEST         NULL   NULL   NULL       NULL        NULL         NULL
 3     NULL       NULL         Test   NULL   NULL       NULL        NULL         NULL
 4     NULL       NULL         NULL   Test   NULL       NULL        NULL         NULL
 5     NULL       NULL         NULL   NULL   Test       NULL        NULL         NULL
 6     NULL       NULL         NULL   NULL   NULL       Test        NULL         NULL
 7     NULL       NULL         NULL   NULL   NULL       NULL        TEST         NULL
 8     NULL       NULL         NULL   NULL   NULL       NULL        NULL         TEST

null ではない各フィールドのデータを最初のインスタンスにマージしてから、そのレコードを更新し、残りの 7 つのレコードを削除したいと考えています。

私はまだSQLを始めていますが、結合、挿入、更新、削除などを理解しています。アドバイスや指示をいただければ幸いです。このデータをレポートにマージできる投稿を複数見つけましたが、実際にデータを実際にマージして重複行を削除できる投稿は多くありません。

検索中にこの投稿を見つけたので、探しているものかもしれません mysql-consolidate-duplicate-data-records-via-update-delete

4

2 に答える 2

1

これを試してみてください -

SET NOCOUNT ON;

DECLARE @temp TABLE
(
      CID INT PRIMARY KEY
    , LastName NVARCHAR(10)
    , FirstName NVARCHAR(10)
    , Street NVARCHAR(10)
    , City NVARCHAR(10)
    , ZipCode NVARCHAR(10)
    , HomePhone NVARCHAR(10)
    , CellPhone NVARCHAR(10)
    , EmailAddr NVARCHAR(10)
)

INSERT INTO @temp (CID, LastName, FirstName, Street, City, ZipCode, HomePhone, CellPhone, EmailAddr)
VALUES 
    (1,  'Test', NULL,   NULL,   NULL,   NULL,   NULL, NULL, NULL),
    (2,  NULL,   'TEST', NULL,   NULL,   NULL,   NULL, NULL, NULL),
    (3,  NULL,   NULL,   'Test', NULL,   NULL,   NULL, NULL, NULL),
    (4,  NULL,   NULL,   NULL,   'Test', NULL,   NULL, NULL, NULL),
    (5,  NULL,   NULL,   NULL,   NULL,   'Test', NULL, NULL, NULL),
    (6,  NULL,   NULL,   NULL,   NULL,   NULL,   'Test', NULL, NULL),
    (7,  NULL,   NULL,   NULL,   NULL,   NULL,   NULL, 'TEST', NULL),
    (8,  NULL,   NULL,   NULL,   NULL,   NULL,   NULL, NULL, 'TEST'),
    (12, 'Tes2',  NULL,  NULL,   NULL,   NULL,   NULL, NULL, NULL),
    (14, NULL,   'TES2', NULL,   NULL,   NULL,   NULL, NULL, NULL),
    (17, NULL,   NULL,   'Tes2', NULL,   NULL,   NULL, NULL, NULL),
    (18, 'Tes3', NULL,   NULL,   NULL,   NULL,   NULL, NULL, NULL),
    (19, NULL,   'TES3', NULL,   NULL,   NULL,   NULL, NULL, NULL),
    (20, NULL,   NULL,   'Tes3', NULL,   NULL,   NULL, NULL, NULL),
    (21, NULL,   NULL,   NULL,   'Test3', NULL,   NULL, NULL, NULL)

DECLARE @buffer_temp TABLE
(
      CID INT PRIMARY KEY
    , LastName NVARCHAR(50)
    , FirstName NVARCHAR(50)
    , Street NVARCHAR(50)
    , City NVARCHAR(50)
    , ZipCode NVARCHAR(50)
    , HomePhone NVARCHAR(50)
    , CellPhone NVARCHAR(50)
    , EmailAddr NVARCHAR(50)
)

;WITH cte AS 
(
    SELECT t.CID, NextCID = ISNULL(t2.CID, (SELECT MAX(y.CID) FROM @temp y))  
    FROM @temp t
    OUTER APPLY (
        SELECT TOP 1 CID = t1.CID - 1
        FROM @temp t1
        WHERE t1.CID > t.CID
            AND t1.LastName IS NOT NULL
    ) t2
    WHERE t.LastName IS NOT NULL
)
INSERT INTO @buffer_temp
SELECT 
      t2.CID
    , LastName = MAX(LastName) 
    , FirstName = MAX(FirstName)
    , Street = MAX(Street)
    , City = MAX(City)
    , ZipCode = MAX(ZipCode)
    , HomePhone = MAX(HomePhone)
    , CellPhone = MAX(CellPhone)
    , EmailAddr = MAX(EmailAddr) 
FROM @temp t
CROSS APPLY (
    SELECT *
    FROM cte t2
    WHERE t.CID BETWEEN t2.CID AND t2.NextCID
) t2
GROUP BY t2.CID

DELETE FROM @temp

INSERT INTO @temp
SELECT * 
FROM @buffer_temp

SELECT * 
FROM @temp

出力:

CID         LastName   FirstName  Street     City       ZipCode    HomePhone  CellPhone  EmailAddr
----------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1           Test       TEST       Test       Test       Test       Test       TEST       TEST
12          Tes2       TES2       Tes2       NULL       NULL       NULL       NULL       NULL
18          Tes3       TES3       Tes3       Test3      NULL       NULL       NULL       NULL
于 2013-05-08T07:50:01.140 に答える
0

レコード 1 ~ 8、次に 9 ~ 16、次に 17 ~ 24 などをマージしたいようです。

幸いなことにCID、グループを識別するために使用できるフィールドがあります。必要なのはグループだけであり、式(CID - 1)/8はトリックを実行します (SQL Server は整数を除算するときに整数除算を行うため、0.5 ではなく 4/8 = 0 とします)。クエリは次のとおりです。

select (CID - 1) / 8 as NewCID,
       max(LastName) as LastName, max(FirstName) as FirstName, . . . 
from t
group by (CID - 1) / 8;
于 2013-05-08T00:21:22.000 に答える