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

SQL如何实现按SECTIONNO统计SIZENAME各尺寸的滚动累计计数

SQL累积透视统计解决方案

你当前的PIVOT语句仅能生成单SECTIONNO分组的尺寸计数,要实现历史累计值,只需在PIVOT结果层叠加累计求和窗口函数即可,修改后的SQL如下:

SELECT 
    SECTIONNO,
    SUM(M) OVER(ORDER BY SECTIONNO) AS M,
    SUM(L) OVER(ORDER BY SECTIONNO) AS L,
    SUM(XL) OVER(ORDER BY SECTIONNO) AS XL,
    SUM([2XL]) OVER(ORDER BY SECTIONNO) AS [2XL]
FROM (
    SELECT SECTIONNO, SIZENAME
    FROM TableNAME
) s 
PIVOT (
    COUNT(SIZENAME) FOR [SIZENAME] IN ([M], [L], [XL], [2XL])
) PVT 
ORDER BY SECTIONNO

代码说明

  1. 内层逻辑和你原有实现完全一致,先统计每个SECTIONNO下各尺寸的独立计数
  2. 外层通过SUM() OVER()窗口函数实现累计:
    • 按SECTIONNO升序排序后,每个尺寸列的求和范围覆盖所有序号小于等于当前行的分组
    • 省略窗口帧声明时,默认的计算范围就是「从首行到当前行」,和显式写ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW效果完全一致
  3. 如果你使用的是不支持PIVOT语法的数据库(比如MySQL),也可以用条件聚合加窗口函数的写法实现,逻辑完全等价:
SELECT 
    SECTIONNO,
    SUM(SUM(CASE WHEN SIZENAME='M' THEN 1 ELSE 0 END)) OVER(ORDER BY SECTIONNO) AS M,
    SUM(SUM(CASE WHEN SIZENAME='L' THEN 1 ELSE 0 END)) OVER(ORDER BY SECTIONNO) AS L,
    SUM(SUM(CASE WHEN SIZENAME='XL' THEN 1 ELSE 0 END)) OVER(ORDER BY SECTIONNO) AS XL,
    SUM(SUM(CASE WHEN SIZENAME='2XL' THEN 1 ELSE 0 END)) OVER(ORDER BY SECTIONNO) AS [2XL]
FROM TableNAME
GROUP BY SECTIONNO
ORDER BY SECTIONNO

内容的提问来源于stack exchange,提问作者Ganesan K

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 13:39:03