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

SQL Server 2014 如何实现同季度增量累计求和?

SQL Server 2014 行转列(透视)查询实现方案

该需求为典型的**行转列(透视)**场景,假设源表SalesData结构如下:

字段名说明
EmpID员工ID
EmpName员工姓名
SaleMonth销售月份(存储值为Jan/Feb/Mar等月份缩写)
SaleAmount销售金额

目标输出为员工ID、员工姓名作为固定行,每个月份作为单独列存储对应销售金额,可选择以下任意一种实现方式:


方法1:使用内置PIVOT函数实现

SQL Server 2005及以上版本均支持,语法简洁直观:

SELECT 
    EmpID,
    EmpName,
    ISNULL(Jan, 0) AS Jan,
    ISNULL(Feb, 0) AS Feb,
    ISNULL(Mar, 0) AS Mar,
    ISNULL(Apr, 0) AS Apr,
    ISNULL(May, 0) AS May,
    ISNULL(Jun, 0) AS Jun,
    ISNULL(Jul, 0) AS Jul,
    ISNULL(Aug, 0) AS Aug,
    ISNULL(Sep, 0) AS Sep,
    ISNULL(Oct, 0) AS Oct,
    ISNULL(Nov, 0) AS Nov,
    ISNULL(Dec, 0) AS Dec
FROM 
(
    -- 源数据子查询,可按需加过滤条件
    SELECT EmpID, EmpName, SaleMonth, SaleAmount
    FROM SalesData
) AS SourceTable
PIVOT
(
    -- 聚合函数可根据需求替换为COUNT/AVG等
    SUM(SaleAmount)
    FOR SaleMonth IN (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
) AS PivotTable
ORDER BY EmpID;

方法2:使用CASE WHEN+聚合函数实现

兼容更低版本SQL Server,逻辑更灵活可自定义复杂规则:

SELECT
    EmpID,
    EmpName,
    SUM(CASE WHEN SaleMonth = 'Jan' THEN SaleAmount ELSE 0 END) AS Jan,
    SUM(CASE WHEN SaleMonth = 'Feb' THEN SaleAmount ELSE 0 END) AS Feb,
    SUM(CASE WHEN SaleMonth = 'Mar' THEN SaleAmount ELSE 0 END) AS Mar,
    SUM(CASE WHEN SaleMonth = 'Apr' THEN SaleAmount ELSE 0 END) AS Apr,
    SUM(CASE WHEN SaleMonth = 'May' THEN SaleAmount ELSE 0 END) AS May,
    SUM(CASE WHEN SaleMonth = 'Jun' THEN SaleAmount ELSE 0 END) AS Jun,
    SUM(CASE WHEN SaleMonth = 'Jul' THEN SaleAmount ELSE 0 END) AS Jul,
    SUM(CASE WHEN SaleMonth = 'Aug' THEN SaleAmount ELSE 0 END) AS Aug,
    SUM(CASE WHEN SaleMonth = 'Sep' THEN SaleAmount ELSE 0 END) AS Sep,
    SUM(CASE WHEN SaleMonth = 'Oct' THEN SaleAmount ELSE 0 END) AS Oct,
    SUM(CASE WHEN SaleMonth = 'Nov' THEN SaleAmount ELSE 0 END) AS Nov,
    SUM(CASE WHEN SaleMonth = 'Dec' THEN SaleAmount ELSE 0 END) AS Dec
FROM SalesData
GROUP BY EmpID, EmpName
ORDER BY EmpID;

动态行转列实现(无需手动枚举所有月份)

如果列值不固定或不想写死所有月份,可结合动态SQL实现,适配SQL Server 2014版本:

DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX)

-- 2014版本用FOR XML PATH拼接所有不重复的月份列
SELECT @columns = STUFF((
    SELECT DISTINCT ',' + QUOTENAME(SaleMonth)
    FROM SalesData
    FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

SET @sql = N'
SELECT EmpID, EmpName, ' + @columns + '
FROM 
(
    SELECT EmpID, EmpName, SaleMonth, SaleAmount FROM SalesData
) AS Source
PIVOT
(
    SUM(SaleAmount) FOR SaleMonth IN (' + @columns + ')
) AS PivotResult
ORDER BY EmpID'

EXEC sp_executesql @sql

说明

  • 示例中用ISNULL或ELSE 0将无数据的月份默认填充为0,如需保留NULL值删除对应逻辑即可
  • 如果源表字段名、月份存储格式、聚合规则和示例不同,对应调整相关参数即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 01:06:10