2017-02-01 126 views
1

我在SQL Server 2012中有一个表,其中包含零件清单,零件位置和现有数量。我遇到的问题是有人在将它添加到数据库时将位置放在位置的前面。这允许有两个记录。在SQL Server中合并重复记录

我需要创建一个作业,该作业将在位置之前找到包含空格的零件,并将这些零件添加到位置前没有空格的相同零件。我不确定从哪里开始。

这是前:

Partno | PartRev | Location | OnHand | Identity_Column 
-------------------------------------------------------------------- 
    0D6591D 000   MV3   55.000  103939 
    0D6591D 000   MV3   -55.000 104618 

这是我想什么有作业运行后:

Partno | PartRev | Location | OnHand | Identity_Column 
-------------------------------------------------------------------- 
    0D6591D 000   MV3   0   104618 
+0

它只是一个单一的白色空间吗?或者它可以不仅仅是一个单一的空白空间 –

+0

Identity_Column的“后”行是否有错误?如果你保持行没有空格,它应该是104618,除非别的事情正在发生...... –

+0

对不起,克里斯那是一个错误 –

回答

2

两个步骤:1.更新的记录正确的位置,2.删除错误位置的记录。

update mytable 
set onhand = onhand + 
(
    select coalesce(sum(wrong.onhand), 0) 
    from mytable wrong 
    where wrong.location like ' %' 
    and trim(wrong.location) = mytable.location 
) 
where location not like ' %'; 

delete from mytable where location like ' %'; 
+0

我试过了,我得到了一个重复键错误。 –

+0

重复键?我们不插入数据,我们不更新密钥,我们甚至删除记录。那么我们怎么能得到这样的错误呢? –

+0

您可能只是想用'ltrim'或'rtrim'来相应地更改'trim' – Stephen

1

你可以做一些分组与识别记录HAVING子句。我用REPLACE替换为空字符串的空间位置栏中,您也可以使用LTRIMRTRIM

CREATE TABLE #Sample 
    (
     [Partno] VARCHAR(7) , 
     [PartRev] INT , 
     [Location] VARCHAR(5) , 
     [OnHand] INT , 
     [Identity_Column] INT 
    ); 


INSERT INTO #Sample 
    ([Partno], [PartRev], [Location], [OnHand], [Identity_Column]) 
VALUES 
    ('0D6591D', 000, ' MV3', 55.000, 103939), 
    ('0D6591D', 000, 'MV3', -55.000, 104618) 
; 

SELECT Partno , 
     PartRev , 
     REPLACE(Location, ' ', '') Location, 
     SUM(OnHand) [OnHand] 
FROM #Sample 
GROUP BY REPLACE(Location, ' ', '') , 
     Partno , 
     PartRev 
HAVING COUNT(Identity_Column) > 1; 

DROP TABLE #Sample; 

产地:

Partno PartRev Location OnHand 
0D6591D 0  MV3   0 
+0

我认为我最大的问题是找到不良记录并找到匹配的良好记录。 –