2013-05-07 111 views
1

我有一个表格称为顾客从表格中获取信息填充不是所有字段都是必需的(这是因为表单生成asf/xml与输入的信息),我想能够将重复项合并成一行然后删除重复项。重复的行与信息合并,然后删除重复

这里是我的表

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 

我想从非空到拳讼然后更新该记录并删除其余7条记录每个字段合并数据。

我仍然开始在SQL中,但了解联接,插入,更新删除等任何意见或方向将不胜感激。我发现了多篇文章,我可以将这些数据合并到一个报表中,但不是很多,我可以真正地合并数据并删除重复的行。

我刚刚发现这个职位,同时寻找所以它可能是我所期待的 mysql-consolidate-duplicate-data-records-via-update-delete

+0

所以如果你合并所有8这些记录与CID = 9一个新的记录,做你还想去更新所有相关的表格以用9代替1-8? – 2013-05-08 00:06:23

+0

它看起来像一个糟糕的结构。你将如何确定哪些行要“合并”?我的意思是你可以“合并”不同人的姓氏和名字。 – 2013-05-08 00:07:46

+1

另一件事是,你如何知道名字与姓氏相关,街道甚至与城市有关 - 这里没有关系,你最终会混淆数据。 – 2013-05-08 00:07:47

回答

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 
0

看起来要合并的记录1-8,然后9-16,然后17-24,等等上。您可以使用CID字段来识别组。所有你需要的是组,并且公式(CID - 1)/8可以做到这一点(SQL Server在分割整数时进行整数除法,例如4/8 = 0而不是0.5)。下面是该查询:

select (CID - 1)/8 as NewCID, 
     max(LastName) as LastName, max(FirstName) as FirstName, . . . 
from t 
group by (CID - 1)/8; 
+0

谢谢你 – ondrovic 2013-05-10 18:24:48