SQL Server中截断RID后缀后按RID分组汇总QTY的实现方法
SQL Server 按标准化RID分组聚合实现方案
核心实现逻辑
- RID标准化处理:定位RID字段中第一个
.的位置,截取该位置前的内容作为标准化RID;如果RID本身不带.后缀,直接保留原值 - LID字段规则:按标准化RID分组后,统计组内去重后的LID数量,数量为1时保留该唯一LID值,其余情况统一置为NULL
- QTY字段处理:直接对分组内所有QTY值求和得到汇总结果
兼容全版本SQL Server的实现代码
SELECT -- 生成去后缀的标准化RID CASE WHEN CHARINDEX('.', RID) > 0 THEN LEFT(RID, CHARINDEX('.', RID) - 1) ELSE RID END AS StdRID, -- 按规则返回LID CASE WHEN COUNT(DISTINCT LID) = 1 THEN MAX(LID) ELSE NULL END AS LID, -- 汇总QTY SUM(QTY) AS TotalQTY FROM YourBusinessTable -- 替换为你实际使用的业务表名 GROUP BY CASE WHEN CHARINDEX('.', RID) > 0 THEN LEFT(RID, CHARINDEX('.', RID) - 1) ELSE RID END
场景适配说明
- 上述RID截取逻辑适配单段数字后缀场景。如果业务中存在多段点分隔后缀(如
B123.2.1),需要截取最后一个.之前内容的话,将定位.位置的表达式替换为LEN(RID) - CHARINDEX('.', REVERSE(RID)) + 1即可 - 现有逻辑会自动忽略LID为NULL的行进行去重计数,如果组内同时存在非NULL LID和NULL LID,会判定为多值场景返回NULL。如果需要将NULL也作为一个有效值参与判断,可以调整CASE中的计数条件
- SUM函数默认会忽略QTY为NULL的行,如果需要将NULL值按0计入汇总,将
SUM(QTY)替换为SUM(ISNULL(QTY, 0))即可
内容的提问来源于stack exchange,提问作者Jessica
相关产品推荐
相关产品推荐

