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

基于外部表的动态列改造SQL查询:替换硬编码type条件

解决方案:从临时表动态生成条件聚合列

要实现从临时表#fm动态获取type值,替代原查询中的硬编码条件,同时保留原有的条件聚合逻辑,可以通过动态SQL拼接来实现,具体步骤如下:

实现代码(SQL Server 2017+)

利用STRING_AGG函数快速拼接type对应的条件聚合片段:

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

-- 从#fm中动态生成每个type对应的CASE聚合列
SELECT @cols = STRING_AGG(
    CONCAT(
        'MAX(CASE WHEN type = ''', type, ''' THEN currency END) AS [', type, ' cur]'
    ),
    ', '
)
FROM #fm

-- 组装完整的查询语句
SET @sql = CONCAT(
    'SELECT [date], id, ', @cols, '
     FROM myTable
     GROUP BY [date], id'
)

-- 执行动态SQL
EXEC sp_executesql @sql

兼容低版本SQL Server(2016及以下)

如果你的SQL Server版本不支持STRING_AGG,可以用FOR XML PATH来拼接片段:

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

-- 拼接CASE聚合列片段
SELECT @cols = STUFF((
    SELECT ', MAX(CASE WHEN type = ''' + type + ''' THEN currency END) AS [' + type + ' cur]'
    FROM #fm
    FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 2, '')

-- 组装并执行查询
SET @sql = 'SELECT [date], id, ' + @cols + '
            FROM myTable
            GROUP BY [date], id'

EXEC sp_executesql @sql

说明

  • 这段代码会自动读取临时表#fm中的所有type值,生成与原查询逻辑完全一致的条件聚合列,列名和目标结果表的格式(如comm cur)匹配。
  • 当#fm中的type值新增、修改或删除时,查询会自动适配,无需手动修改硬编码条件。
  • 该方案保留了你原有的MAX(CASE...)聚合逻辑,比动态透视更贴合你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 07:15:26