在物料清单中插入父项的销售价格而不重复
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
【讨论】:
以上是关于在物料清单中插入父项的销售价格而不重复的主要内容,如果未能解决你的问题,请参考以下文章