如何按分隔符移除sku列末尾的对应值?
问题描述
我正尝试移除sku列中的分隔符(-)及其后面的对应值,恳请提供帮助!
示例表格
| container | sku | qty |
|---|---|---|
| YMLU1234567 | 534164 | 1877 |
| YMLU1234567 | 987876 | 554 |
| YMLU1234567 | 987876-1 | 91 |
| YMLU1234567 | 987877 | 841 |
| YMLU1234567 | 987877-1 | 106 |
当前代码
SELECT [so].[OrderGroup] as container, REVERSE(LEFT(REVERSE([so].[CustomerOrderNumber]), CHARINDEX(' ', REVERSE([so].[CustomerOrderNumber]) + ' ') - 1)) AS sku, sum([so].[QtyShipped]) as AllocatedQty FROM [server].[dbo].[table] as so WHERE [so].Status <> 0 AND [so].CustomerName ='alpha' AND [so].[OrderGroup] ='YMLU1234567' GROUP BY [so].[OrderGroup], REVERSE(LEFT(REVERSE([so].[CustomerOrderNumber]), CHARINDEX(' ', REVERSE([so].[CustomerOrderNumber]) + ' ') - 1))
解决方案
你可以在现有sku字段的处理逻辑外层,添加针对-分隔符的字符串截取逻辑,确保只保留分隔符前的内容。修改后的代码如下:
SELECT [sub].[OrderGroup] as container, -- 处理sku中的'-'分隔符,提取前面的内容 CASE WHEN CHARINDEX('-', sub.sku_part) > 0 THEN LEFT(sub.sku_part, CHARINDEX('-', sub.sku_part) - 1) ELSE sub.sku_part END AS sku, sum(sub.[QtyShipped]) as AllocatedQty FROM ( -- 先保留原有的sku提取逻辑,作为中间结果 SELECT [so].[OrderGroup], [so].[QtyShipped], REVERSE(LEFT(REVERSE([so].[CustomerOrderNumber]), CHARINDEX(' ', REVERSE([so].[CustomerOrderNumber]) + ' ') - 1)) AS sku_part FROM [server].[dbo].[table] as so WHERE [so].Status <> 0 AND [so].CustomerName ='alpha' AND [so].[OrderGroup] ='YMLU1234567' ) AS sub GROUP BY [sub].[OrderGroup], CASE WHEN CHARINDEX('-', sub.sku_part) > 0 THEN LEFT(sub.sku_part, CHARINDEX('-', sub.sku_part) - 1) ELSE sub.sku_part END
逻辑说明
- 用子查询保留你原本的
sku提取逻辑,得到中间字段sku_part; - 通过
CHARINDEX('-', sku_part)检查是否存在-分隔符:- 若存在,用
LEFT(sku_part, CHARINDEX('-', sku_part) - 1)截取分隔符前的内容; - 若不存在,直接返回原
sku_part内容;
- 若存在,用
- 分组时同步使用相同的处理逻辑,保证分组维度与查询字段一致。
如果使用SQL Server 2017及以上版本,也可以用STRING_SPLIT结合TOP 1的简化写法,但上面的写法兼容性更强。
内容的提问来源于stack exchange,提问作者Clayton Hua
相关产品推荐
相关产品推荐

