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

SQL查询优化:仅在每个账单号最后一行显示账单总计

解决每个账单仅最后一行显示总计的SQL问题

我懂你的需求——现在每个账单(bill_num)的每一行都重复显示了账单总计,你只想让这个总计出现在每个账单的最后一行。咱们来一步步调整这个查询:

问题根源

你当前通过LEFT JOIN bills b ON S.bill_num = B.bill_num把账单表关联进来,因为每个bill_num在bills表中只有一条记录,所以每一行都会带出相同的billamt,导致总计重复显示。

解决方案思路

用窗口函数标记每个账单的最后一行:

  1. 给每个账单内的行按顺序编号
  2. 计算每个账单包含的总行数
  3. 用CASE语句判断,只有当行号等于总行数时,才显示billamt,否则显示NULL(也可以改成空字符串,看你需求)

修改后的查询语句

SELECT 
    ROW_NUMBER() OVER( ORDER BY S.bill_num ) SN,
    ROW_NUMBER() OVER( PARTITION BY S.bill_num ORDER BY S.bill_num ) AS [ITEM_NO.],
    s.bill_date AS [BILL_DATE],
    s.bill_num AS [BILL_NO.],
    s.custid AS [CUST_ID],
    c.fullname [CUSTOMER],
    s.article AS [ARTICLE],
    s.price AS [MRP],
    s.linetotal AS [TOTAL],
    -- 核心逻辑:仅在当前账单的最后一行显示总计
    CASE 
        WHEN ROW_NUMBER() OVER(PARTITION BY s.bill_num ORDER BY s.bill_num) 
             = COUNT(*) OVER(PARTITION BY s.bill_num)
        THEN b.billamt 
        ELSE NULL 
    END AS [BILL_TOTAL]
FROM sold s 
LEFT JOIN customers c ON s.custid = c.custid 
LEFT JOIN bills b ON S.bill_num = B.bill_num 
WHERE s.bill_date = CONVERT(date, '2020/12/01') 
  AND B.isexpress <> 'P' 
ORDER by S.bill_num;

关键说明

  • ROW_NUMBER() OVER(PARTITION BY s.bill_num ORDER BY s.bill_num):给每个账单内的行按bill_num排序编号(如果你的账单行有专属的排序字段,比如行号列,可以替换这里的ORDER BY内容)
  • COUNT(*) OVER(PARTITION BY s.bill_num):计算每个账单包含的总行数
  • CASE语句:当当前行的编号等于账单总行数时,显示billamt,否则显示NULL,完美实现仅最后一行显示总计的效果

如果你的ITEM_NO.本身就是账单内的行号,还可以简化代码,直接用它来判断:

CASE 
    WHEN [ITEM_NO.] = COUNT(*) OVER(PARTITION BY s.bill_num)
    THEN b.billamt 
    ELSE NULL 
END AS [BILL_TOTAL]

内容的提问来源于stack exchange,提问作者Raj Shekhar Singh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:33:20