Обновление хранимой процедуры для удаления дубликатов - PullRequest
0 голосов
/ 10 марта 2020

Это моя хранимая процедура:

ALTER PROCEDURE [dbo].[Proc_SAP_Mat_InsertWhereUse]
    (@cust varchar(10),
     @materials varchar(15),
     @Comp varchar(20),
     @qty int)

    SET NOCOUNT ON;

    IF EXISTS ((SELECT DISTINCT COUNT(*) FROM [SAP_Mat_WhereUse] 
                WHERE Material = @materials AND Component = @Comp 
                HAVING COUNT(*) > 0))
    BEGIN 
        IF EXISTS ((SELECT DISTINCT COUNT(*) FROM [SAP_Mat_WhereUse] 
                    WHERE Material = @materials AND Component = @Comp 
                      AND Quantity =  @qty 
                    HAVNG COUNT(*) = 0))
        BEGIN
            UPDATE [SAP_Mat_WhereUse] 
            SET Quantity =  @qty 
            WHERE Material = @materials AND Component = @Comp
        END
    END
    ELSE IF ((SELECT DISTINCT COUNT(*) FROM [SAP_Mat_WhereUse] 
              WHERE Material = @materials AND Component = @Comp 
                AND Quantity = @qty) = 0)
    BEGIN
        INSERT INTO SAP_Mat_WhereUse (Customer, Material, Component, Quantity) 
        VALUES (@cust, @materials, @Comp, @qty)
    END

Это мои данные базы данных

https://i.stack.imgur.com/HlD3d.png

При наличии дублированного материала + дублированный компонент, тогда хранимая процедура должна автоматически удалять дублированные строки и обновлять количество первичных строк. И дублированный материал + недублированный компонент должны остаться.

Следовательно, я могу удалить дубликаты, но счетчик количества остается неизменным, нужно ли вносить какие-либо изменения в мою существующую хранимую процедуру? Пожалуйста, помогите

1 Ответ

0 голосов
/ 10 марта 2020

На вашем месте я бы сначала попытался исправить данные, а затем изменить процедуру только на INSERT или UPDATE. Например, следующий код должен это сделать (но, пожалуйста, сначала проверьте его):

WITH DataSource AS
(
    SELECT Customer
          ,Material   
          ,Component 
          ,SUM(ISNULL(quantity, 0)) OVER (PARTITION BY  Customer, Material, Component) AS [OveralQty]
          ,ROW_NUMBER() OVER (PARTITION BY  Customer, Material, Component ORDER BY (SELECT 1)) AS [RowID]
    FROM [SAP_Mat_WhereUse]
)
SELECT *
INTO #DataSource
FROM DataSource
WHERE [RowID] = 1;

TRUNCATE TABLE [SAP_Mat_WhereUse];

INSERT INTO [SAP_Mat_WhereUse]
SELECT *
FROM #DataSource;

Затем вы можете изменить свою процедуру следующим образом:

ALTER PROCEDURE [dbo].[Proc_SAP_Mat_InsertWhereUse]
(@cust varchar(10),
 @materials varchar(15),
 @Comp varchar(20),
 @qty int) 
 AS
 BEGIN;

SET NOCOUNT ON;



IF EXISTS
(
    SELECT 1 
    FROM [SAP_Mat_WhereUse] 
    WHERE Material = @materials 
        AND Component = @Comp 
        AND Customer = @cust
)   
    BEGIN
        UPDATE [SAP_Mat_WhereUse] 
        SET Quantity =  @qty 
        WHERE Material = @materials 
            AND Component = @Comp
            AND Customer = @cust;
    END
ELSE
    BEGIN
        INSERT INTO SAP_Mat_WhereUse (Customer, Material, Component, Quantity) 
        VALUES (@cust, @materials, @Comp, @qty);
    END

END

Конечно, в зависимости от в зависимости от размера данных вы не сможете исправить данные в одном и предпочитаете делать это постепенно.

Вы можете применить то же исправление, но для определенных строк:

WITH DataSource AS
(
    SELECT Customer
          ,Material   
          ,Component 
          ,SUM(ISNULL(quantity, 0)) OVER () AS [OveralQty]
          ,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) AS [RowID]
    FROM [SAP_Mat_WhereUse]
    WHERE Customer = @cust
        AND Material = @materials 
        AND Component  = @comp
)
SELECT *
INTO #DataSource
FROM DataSource
WHERE [RowID] = 1;

DELETE FROM [SAP_Mat_WhereUse]
WHERE Customer = @cust
    AND Material = @materials 
    AND Component  = @comp 

INSERT INTO [SAP_Mat_WhereUse]
SELECT Customer
      ,Material   
      ,Component 
      ,[OveralQty] + qty 
FROM #DataSource;

или (потому что есть много вариантов сделать это) - вы можете просто sum(quantity) в своем текущем коде, сохранить его в переменной и затем добавить его.

...