SQL排序需求:保持非TAX行顺序,按ITEM_NAME排序末尾税行
发票数据排序需求与SQL解决方案
需求说明
- 保持
ITEM_NAME不含TAX的行的原始数据库注册顺序不变 - 将所有
ITEM_NAME含TAX的行移至数据末尾 - 税行(含
TAX的行)按ITEM_NAME中的税率数值升序排列(例如:TAX7% → TAX8% → TAX10% → TAX16%)
现有查询语句
SELECT DISTINCT C.DATE, C.SLIP_NO, C.ORDER_NO, C.ITEM_NAME FROM BILL_PDF_TBL A INNER JOIN BILL_TBL B ON A.PDF_ID = B.BILL_NO INNER JOIN BILL_DETAIL C ON B.BILL_NO = C.BILL_NO AND A.PDF_ID = C.BILL_NO
优化后的查询语句
SELECT DISTINCT C.DATE, C.SLIP_NO, C.ORDER_NO, C.ITEM_NAME FROM BILL_PDF_TBL A INNER JOIN BILL_TBL B ON A.PDF_ID = B.BILL_NO INNER JOIN BILL_DETAIL C ON B.BILL_NO = C.BILL_NO AND A.PDF_ID = C.BILL_NO ORDER BY -- 区分非税行和税行,非税行在前 CASE WHEN C.ITEM_NAME NOT LIKE '%TAX%' THEN 1 ELSE 2 END, -- 非税行保持原始顺序:如果有自增主键/创建时间字段,替换成对应字段更可靠 CASE WHEN C.ITEM_NAME NOT LIKE '%TAX%' THEN C.SLIP_NO END, -- 税行按税率数值升序 CAST(SUBSTRING(C.ITEM_NAME, PATINDEX('%[0-9]%', C.ITEM_NAME), CHARINDEX('%', C.ITEM_NAME) - PATINDEX('%[0-9]%', C.ITEM_NAME)) AS INT)
逻辑说明
- 先通过CASE判断把不含TAX的行排在前面,含TAX的行统一放到最后
- 不含TAX的行用
SLIP_NO维持原始注册顺序;如果数据库里有专门记录创建时间或者自增ID的字段,把这里的C.SLIP_NO换成那个字段,顺序会更准确 - 含TAX的行从
ITEM_NAME里提取出税率的数字部分,转成整数后从小到大排序,就能实现TAX7%、TAX8%这样的顺序
内容的提问来源于stack exchange,提问作者Natu
相关产品推荐
相关产品推荐

