2017-02-01 55 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

我認爲我最大的問題是找到不良記錄並找到匹配的良好記錄。 –