基于外部表的动态列改造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
相关产品推荐
相关产品推荐

