SQL查询优化:仅在每个账单号最后一行显示账单总计
解决每个账单仅最后一行显示总计的SQL问题
我懂你的需求——现在每个账单(bill_num)的每一行都重复显示了账单总计,你只想让这个总计出现在每个账单的最后一行。咱们来一步步调整这个查询:
问题根源
你当前通过LEFT JOIN bills b ON S.bill_num = B.bill_num把账单表关联进来,因为每个bill_num在bills表中只有一条记录,所以每一行都会带出相同的billamt,导致总计重复显示。
解决方案思路
用窗口函数标记每个账单的最后一行:
- 给每个账单内的行按顺序编号
- 计算每个账单包含的总行数
- 用
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
相关产品推荐
相关产品推荐

