Сравнение и обновление отрицательных и положительных значений - PullRequest
0 голосов
/ 18 октября 2019

У меня большой набор данных, содержащий транзакционные данные. Данные включают в себя кредитные ноты, которые по сути являются «возвращенными» товарами. Чтобы сместить положительное значение, каждый из этих возвратов имеет одинаковую отрицательную запись.

Я ищу SQL-запрос для определения и пометки ("Y") набора записей, которые нейтрализуют друг друга, чтобы исключить подмножество вместо удаления данных.

Мои данные содержатстолбец идентификатора.


Доступна схема;

http://sqlfiddle.com/#!18/8b0f1

Ответы [ 2 ]

0 голосов
/ 18 октября 2019

чтобы получить записи для исключения, попробуйте

With Ranker AS 
(SELECT *, 
     row_number() 
             OVER (
                     PARTITION BY Product_Code, RCV_Quantity, RCV_Unit_Cost, RCV_Total 
                     ORDER BY RCV_Total ASC
                   ) AS pos_rank,
     row_number() 
             OVER (
                     PARTITION BY Product_Code, RCV_Quantity, RCV_Unit_Cost, RCV_Total 
                     ORDER BY RCV_Total DESC
                   ) AS neg_rank
       FROM [dbo].[Data_FY19]
)
select r1.*, r2.* from Ranker r1 JOIN Ranker r2 on r1.RCV_Total >0 
                                     AND r2.RCV_Total <0 
                                     AND r1.pos_rank = r2.neg_rank
                                     AND r1.Product_Code = r2.Product_Code 
                                     AND r1.RCV_Quantity = -1* r2.RCV_Quantity
                                     AND r1.RCV_Unit_Cost = r2.RCV_Unit_Cost
                                     AND r1.RCV_Total = -1* r2.RCV_Total
0 голосов
/ 18 октября 2019

Следующий код может работать согласно вашим ожиданиям, но я все еще работаю над созданием двойной временной таблицы. а также вам нужно иметь основной идентификатор в основной таблице, чтобы обновить его, так как это просто покажет результат во временной таблице.

CREATE TABLE [dbo].[Data_FY19]
(
    [Product_Code] [VARCHAR](150) NULL,
    [RCV_Quantity] DECIMAL(12, 2) NULL,
    [RCV_Unit_Cost] DECIMAL(12, 2) NULL,
    [RCV_Total] DECIMAL(12, 2) NULL,
    [Return_Flag] [VARCHAR](150) NULL
) ON [PRIMARY];
GO

INSERT INTO [dbo].[Data_FY19]
(
    [Product_Code],
    [RCV_Quantity],
    [RCV_Unit_Cost],
    [RCV_Total]
)
VALUES
('1234', '1', '10', '10'),
('1235', '2', '12', '24'),
('1236', '2', '15', '30'),
('1237', '1', '20', '20'),
('1238', '2', '15', '30'),
('1239', '3', '10', '30'),
('1240', '2', '20', '40'),
('1236', '4', '15', '60'),
('1234', '3', '10', '30'),
('1239', '-3', '10', '-30'),
('1236', '-2', '15', '-30'),
('1234', '-1', '10', '-10'),
('1237', '-1', '20', '-20'),
('1235', '-2', '12', '-24'),
('1235', '2', '12', '24');




SELECT IDENTITY(INT, 1, 1) AS rwno,
       *
INTO #Data_FY19
FROM Data_FY19;



SELECT *,
       ROW_NUMBER() OVER (PARTITION BY Product_Code ORDER BY rwno ASC) AS rn
INTO #maxOfeach
FROM #Data_FY19;

--;WITH maxofeach AS
--()


UPDATE d1
SET Return_Flag = 'Y'
FROM #Data_FY19 d1
    INNER JOIN #Data_FY19 d2
        ON d1.Product_Code = d2.Product_Code
WHERE d1.rwno <> d2.rwno
      AND d1.RCV_Total = ABS(d2.RCV_Total)
      AND d1.RCV_Total + d2.RCV_Total = 0
      AND d1.rwno IN
          (
              SELECT rwno
              FROM #maxOfeach m
              WHERE m.rn = 1
                    AND m.Product_Code = d1.Product_Code
          );

SELECT *
FROM #Data_FY19;

UPDATE d2
SET Return_Flag = 'Y'
FROM #Data_FY19 d1
    INNER JOIN #Data_FY19 d2
        ON d1.Product_Code = d2.Product_Code
WHERE d1.rwno <> d2.rwno
      AND d1.RCV_Total = ABS(d2.RCV_Total)
      AND d1.RCV_Total + d2.RCV_Total = 0
      AND d1.rwno IN
          (
              SELECT rwno
              FROM #maxOfeach m
              WHERE m.rn = 1
                    AND m.Product_Code = d1.Product_Code
          );

SELECT *
FROM #Data_FY19;

DROP TABLE #Data_FY19;
DROP TABLE #maxOfeach;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...