在物料清单中插入父项的销售价格而不重复

Posted

技术标签:

【中文标题】在物料清单中插入父项的销售价格而不重复【英文标题】:Inserting Sales Price of Parent Item in Bill of Materials without repetition 【发布时间】:2019-08-07 23:31:39 【问题描述】:

我有一个物料清单表,我希望根据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 |
+---------+---------------+--------------+------+-------------------+

你能帮我实现上述输出吗?提前感谢您的支持。

【问题讨论】:

感谢to other forums 发布此问题,以便每个人都可以浪费时间追逐相同的信息。 1735 和 3000 是从哪里来的? 【参考方案1】:

这个查询应该给你你想要的结果。它依赖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

Demo on DB Fiddle

线号 | ParentPnxCode | ChildPnx代码 |单位 |老卖价 ------: | :------------ | :----------- | :--- | --------------: 10000 | X | x1 |个人电脑 | 1735 20000 | X | x2 |个人电脑 | 0 30000 | X | x3 |个人电脑 | 0 40000 | X | x4 |个人电脑 | 0 50000 | X | x5 |个人电脑 | 0 60000 | X | x6 |个人电脑 | 0 70000 | X | x7 |个人电脑 | 0 5000 |是 | y1 |个人电脑 | 3000 7500 |是 | y2 |个人电脑 | 0 8750 |是 | y2 |个人电脑 | 0

如果您希望在表中实际创建一个新列来存储该信息,您可以使用(SET 子句中不允许使用ROW_NUMBER(),我切换到具有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

Demo on DB Fiddle

【讨论】:

【参考方案2】:

如果父项的价格存储在主表中。

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

【讨论】:

以上是关于在物料清单中插入父项的销售价格而不重复的主要内容,如果未能解决你的问题,请参考以下文章

金蝶财务软件KIS专业版怎么制作BOM(物料清单)

sap 采购订单和销售订单指令

运用SAP系统,求下面操作的步骤(跪求)

Excel:在多列中查找具有重复项的多个值

DataTable update() 插入重复的新行而不检查它是不是存在

将多行插入多个表而不重复“INSERT INTO”