我有一个“订单表”。在“订单表”中,有一个多用途的列,称为“单位”。
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。
您根据数据结构的目标是接单,并确定箱号。 ProductID = 1111代表用于放置订单商品的“新盒子”。如包装。
事实上,您必须存储局部变量以增加值,并通过增加它,然后可以将其打印为输出。
您的SQL CASE可以工作,但是不能提供您期望的结果,这仅仅是因为它的条件是在相应的行中提供“单位”,例如:
只需通过这种方式进行调整,就可以在productid
等于1111
的行上返回null。
(CASE productid WHEN 1111 THEN null ELSE 1 END) AS boxno
但是我想如果有一些区别,那实际上取决于您使用的数据库。
作为测试,我使用PostGreSQL中提供的数据创建了一个简单的表,但是事实仍然如上所述。.除非编写脚本,否则您无法存储局部变量。
您可以使用的一种解决方法是,使用当前行的id
确定应考虑的结果,然后将其与count()
堆叠在一起。
同样,通过使用以下查询,这已在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),将是这样并按以下方式排序:
我希望我没有太难了))