Вставка продажной цены родительской позиции в ведомость материалов без повторения - PullRequest
0 голосов
/ 17 марта 2019

У меня есть таблица спецификаций, в которую я хочу вставить продажную цену (только один раз в первой строке) на основе ParentItemCode.

Цена родительского элемента X равна 1735, а Y равна 3000.

Ниже приведены данные:

CREATE TABLE mytable (
    LineNum INT NOT NULL PRIMARY KEY
    ,ParentPnxCode VARCHAR(1) NOT NULL
    ,ChildPnxCode VARCHAR(2) NOT NULL
    ,Unit VARCHAR(3) NOT NULL
    );

INSERT INTO mytable (
    LineNum
    ,ParentPnxCode
    ,ChildPnxCode
    ,Unit
    )
VALUES (
    10000
    ,'X'
    ,'x1'
    ,'PCS'
    );

INSERT INTO mytable (
    LineNum
    ,ParentPnxCode
    ,ChildPnxCode
    ,Unit
    )
VALUES (
    20000
    ,'X'
    ,'x2'
    ,'PCS'
    );

INSERT INTO mytable (
    LineNum
    ,ParentPnxCode
    ,ChildPnxCode
    ,Unit
    )
VALUES (
    30000
    ,'X'
    ,'x3'
    ,'PCS'
    );

INSERT INTO mytable (
    LineNum
    ,ParentPnxCode
    ,ChildPnxCode
    ,Unit
    )
VALUES (
    40000
    ,'X'
    ,'x4'
    ,'PCS'
    );

INSERT INTO mytable (
    LineNum
    ,ParentPnxCode
    ,ChildPnxCode
    ,Unit
    )
VALUES (
    50000
    ,'X'
    ,'x5'
    ,'PCS'
    );

INSERT INTO mytable (
    LineNum
    ,ParentPnxCode
    ,ChildPnxCode
    ,Unit
    )
VALUES (
    60000
    ,'X'
    ,'x6'
    ,'PCS'
    );

INSERT INTO mytable (
    LineNum
    ,ParentPnxCode
    ,ChildPnxCode
    ,Unit
    )
VALUES (
    70000
    ,'X'
    ,'x7'
    ,'PCS'
    );

INSERT INTO mytable (
    LineNum
    ,ParentPnxCode
    ,ChildPnxCode
    ,Unit
    )
VALUES (
    5000
    ,'Y'
    ,'y1'
    ,'PCS'
    );

INSERT INTO mytable (
    LineNum
    ,ParentPnxCode
    ,ChildPnxCode
    ,Unit
    )
VALUES (
    7500
    ,'Y'
    ,'y2'
    ,'PCS'
    );

INSERT INTO mytable (
    LineNum
    ,ParentPnxCode
    ,ChildPnxCode
    ,Unit
    )
VALUES (
    8750
    ,'Y'
    ,'y2'
    ,'PCS'
    );

Ниже приводится желаемый результат:

+---------+---------------+--------------+------+-------------------+
| LineNum | ParentPnxCode | ChildPnxCode | Unit | Old Selling Price |
+---------+---------------+--------------+------+-------------------+
|   10000 | X             | x1           | PCS  |              1735 |
|   20000 | X             | x2           | PCS  |                 0 |
|   30000 | X             | x3           | PCS  |                 0 |
|   40000 | X             | x4           | PCS  |                 0 |
|   50000 | X             | x5           | PCS  |                 0 |
|   60000 | X             | x6           | PCS  |                 0 |
|   70000 | X             | x7           | PCS  |                 0 |
|    5000 | Y             | y1           | PCS  |              3000 |
|    7500 | Y             | y2           | PCS  |                 0 |
|    8750 | Y             | y2           | PCS  |                 0 |
+---------+---------------+--------------+------+-------------------+

Не могли бы вы помочь мне в достижении вышеуказанного результата? Спасибо за вашу поддержку заранее.

Ответы [ 2 ]

1 голос
/ 17 марта 2019

Этот запрос должен дать вам результат, который вы хотите.Он полагается на ROW_NUMBER(), чтобы определить, является ли текущая запись первой в группе, и соответственно отображает ожидаемое значение:

SELECT 
    t.*,
    CASE 
        WHEN ROW_NUMBER() OVER(PARTITION BY ParentPnxCode ORDER BY LineNum) = 1
        THEN CASE ParentPnxCode
            WHEN 'X' THEN 1735
            WHEN 'Y' THEN 3000
        END
        ELSE 0
    END OldSellingPrice
FROM mytable t

Демонстрация на DB Fiddle :

LineNum | ParentPnxCode | ChildPnxCode | Unit | OldSellingPrice
------: | :------------ | :----------- | :--- | --------------:
  10000 | X             | x1           | PCS  |            1735
  20000 | X             | x2           | PCS  |               0
  30000 | X             | x3           | PCS  |               0
  40000 | X             | x4           | PCS  |               0
  50000 | X             | x5           | PCS  |               0
  60000 | X             | x6           | PCS  |               0
  70000 | X             | x7           | PCS  |               0
   5000 | Y             | y1           | PCS  |            3000
   7500 | Y             | y2           | PCS  |               0
   8750 | Y             | y2           | PCS  |               0

Если вы действительно хотите создать новый столбец в таблице для хранения этой информации, вы можете пойти (ROW_NUMBER() не разрешено в SET предложении, которое я переключилв коррелированный подзапрос с условием NOT EXISTS):

ALTER table mytable ADD OldSellingPrice int;
UPDATE t
SET t.OldSellingPrice = 
    CASE WHEN NOT EXISTS(SELECT 1 FROM mytable t1 WHERE t.ParentPnxCode = t1.ParentPnxCode AND t1.LineNum < t.LineNum)
        THEN CASE ParentPnxCode
            WHEN 'X' THEN 1735
            WHEN 'Y' THEN 3000
        END
        ELSE 0
    END
FROM mytable t

Демонстрация по DB Fiddle

0 голосов
/ 17 марта 2019

ЕСЛИ цена родительского элемента хранится в основной таблице.

SELECT LineNum, ParentPnxCode, ChildPnxCode, Unit, 
Old_Selling_Price = IIF((LAG(ParentPnx_Price) OVER(PARTITION BY mytable.ParentPnxCode ORDER BY mytable.ParentPnxCode) IS NULL),ParentPnx_Price,0)
FROM mytable
INNER JOIN ParentPnx_Master ON mytable.ParentPnxCode = ParentPnx_Master.ParentPnxCode
ORDER BY mytable.ParentPnxCode
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...