You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 20:40:30