如何将表格中的特定值添加到新列?

问题描述 投票:0回答:1

我有一个“订单表”。在“订单表”中,有一个多用途的列,称为“单位”。

OrderCode,ProductCode,ProductName,Unit,ProductId123、002、1号,1111号箱123,223344,Abc,4,11873993123,888444,Zxc,1,66474833123,883372,Ubn,2,88575744123、002、2、1111号信箱123,788665,Muq,3,88887777123,900223,Zue,1,22234567123,665543,Erv,1,12399998

“ Unit”列的box-numbers值从1到N为特定值,其中ProductID = 1111。此外,“单位”列还具有单位值 对于其他ProductID

每个订单均以ProductID = 1111开始,并且第一个框号= 1(显示在“单位”字段中)下面的产品在同一框中,直到下一个ProductID = 1111,然后框号= N(在“单位”字段中显示)

单位字段显示除ProductID = 1111以外的产品数量

我尝试过:

CASE WHEN ProductId = 1111 THEN Unit END AS BoxNo 

但是它不起作用。

我想添加一个名为“ BoxNo”的新列,其中包含每个产品的箱号

OrderCode,BoxNo,ProductCode,ProductName,Unit,ProductId123,Null,002,方框号1,1,1111123,1,223344,Abc,4、11873993123,1,888444,Zxc,1,66474833123,[1,883883,Ubn,2、88575744123,Null,002、2、1111号方框123,2,788665,Muq,3、88887777123,2,900223,Zue,1,22234567123,2,665543,Erv,1,12399998
sql
1个回答
0
投票

您可以做到,但是您需要一些脚本功能,而不仅仅是普通的SQL。

您根据数据结构的目标是接单,并确定箱号。 ProductID = 1111代表用于放置订单商品的“新盒子”。如包装。

事实上,您必须存储局部变量以增加值,并通过增加它,然后可以将其打印为输出。

您的SQL CASE可以工作,但是不能提供您期望的结果,这仅仅是因为它的条件是在相应的行中提供“单位”,例如: sets the box number as unit just if product id equals 1111

只需通过这种方式进行调整,就可以在productid等于1111的行上返回null。

(CASE productid WHEN 1111 THEN null ELSE 1 END) AS boxno

结果: null printed as box no if product id equals 1111

但是我想如果有一些区别,那实际上取决于您使用的数据库。

作为测试,我使用PostGreSQL中提供的数据创建了一个简单的表,但是事实仍然如上所述。.除非编写脚本,否则您无法存储局部变量。

您可以使用的一种解决方法是,使用当前行的id确定应考虑的结果,然后将其与count()堆叠在一起。

simple select with the result of the script inserted above

同样,通过使用以下查询,这已在PostGreSQL(pgAdmin 4)中实现:

SELECT ordercode,(CASE 
        WHEN productid = 1111 THEN null ELSE
        (SELECT count(productid) FROM test_stck WHERE productid = 1111 AND id < a.id)
        END) AS,
        productcode,productname,unit,productid
FROM test_stck AS a

但是您必须具有可以访问的行的ID,否则将无法访问。我也没有使用它,但是您应该在提取ID列表时对其进行排序。否则,您可能会进行其他排序,这将导致不想要的结果。

另一个可以解决问题的子查询是这样:

SELECT ordercode,(CASE 
        WHEN productid = 1111 THEN null ELSE
        (SELECT unit FROM test_stck WHERE productid = 1111 AND id < a.id ORDER BY unit DESC LIMIT 1)
        END) AS boxno,
        productcode,productname,unit,productid
FROM test_stck AS a

按单位排序,表示您在提取之前对其进行了排序。并且限制1确保您仅选择子查询的最后一个元素,id < a.id也是某种保险。

只是为了可视化子查询完整集(没有限制1),将是这样并按以下方式排序:enter image description here

我希望我没有太难了))

© www.soinside.com 2019 - 2024. All rights reserved.