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

如何生成含分州薪资与平均薪资的目标SQL结果表?

职位薪资数据列转行及平均值计算

需求说明

针对position列中的每个职位类别,计算minrate和maxrate的平均值,同时将不同state对应的minrate和maxrate以列的形式展示(当前为样本数据集,实际存在更多记录)。

样本数据集

state   position        minrate  maxrate
ny      admin assistant 12.5000  14.5000
ny      office manager  20.5000  25.5000
ca      admin assistant 13.5000  15.5000
ca      office manager  21.5000  26.5000
al      admin assistant 11.5000  13.5000
al      office manager  19.5000  24.5000

预期结果

position        ny_min   ny_max   ca_min   ca_max   al_min   al_max   avg_min  avg_max
admin assistant 12.5000  14.5000  13.5000  15.5000  11.5000  13.5000  12.5000  14.5000
office manager  20.5000  25.5000  21.5000  26.5000  19.5000  24.5000  20.5000  25.5000

样本数据初始化SQL

declare @jobs table (
[state] nvarchar(25),
[position] nvarchar(25),
[minrate] decimal(18,4),
[maxrate] decimal(18,4)
)

insert @jobs
values
('ny','admin assistant',12.5, 14.5),
('ny','office manager',20.5, 25.5),
('ca','admin assistant',13.5, 15.5),
('ca','office manager',21.5, 26.5),
('al','admin assistant',11.5, 13.5),
('al','office manager',19.5, 24.5)

解决方案SQL

1. 静态列转行(适配已知州的情况)

如果明确需要展示的州列表,可直接用CASE语句实现:

SELECT
    position,
    MAX(CASE WHEN state = 'ny' THEN minrate END) AS ny_min,
    MAX(CASE WHEN state = 'ny' THEN maxrate END) AS ny_max,
    MAX(CASE WHEN state = 'ca' THEN minrate END) AS ca_min,
    MAX(CASE WHEN state = 'ca' THEN maxrate END) AS ca_max,
    MAX(CASE WHEN state = 'al' THEN minrate END) AS al_min,
    MAX(CASE WHEN state = 'al' THEN maxrate END) AS al_max,
    AVG(minrate) AS avg_min,
    AVG(maxrate) AS avg_max
FROM @jobs
GROUP BY position
ORDER BY position

2. 动态列转行(适配未知州的情况)

如果实际数据包含未知数量的州,可通过动态SQL自动生成列:

DECLARE @cols NVARCHAR(MAX), @query NVARCHAR(MAX)

-- 自动生成所有州对应的min/max列定义
SELECT @cols = STRING_AGG(
    CONCAT(
        'MAX(CASE WHEN state = ''', state, ''' THEN minrate END) AS ', QUOTENAME(state + '_min'), ',',
        'MAX(CASE WHEN state = ''', state, ''' THEN maxrate END) AS ', QUOTENAME(state + '_max')
    ),
    ','
)
FROM (SELECT DISTINCT state FROM @jobs) AS states

-- 拼接完整查询语句
SET @query = CONCAT(
    'SELECT position,', @cols, ',',
    'AVG(minrate) AS avg_min,',
    'AVG(maxrate) AS avg_max',
    ' FROM @jobs GROUP BY position ORDER BY position'
)

-- 执行动态SQL
EXEC sp_executesql @query, N'@jobs TABLE ([state] nvarchar(25), [position] nvarchar(25), [minrate] decimal(18,4), [maxrate] decimal(18,4))', @jobs = @jobs

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:15:32