网站首页 > 知识剖析 正文
核心提示词:
-- 声明变量来存储动态 SQL 语句 DECLARE @DynamicSQL NVARCHAR(MAX); -- 声明变量来存储列名列表 DECLARE @ColumnList NVARCHAR(MAX); -- 动态生成列名列表 SELECT @ColumnList = COALESCE(@ColumnList + ', ', '') + 'SUM(CASE WHEN ddate = ''' + CAST(ddate AS NVARCHAR(255)) + ''' THEN chukushu ELSE 0 END) AS [' + CAST(ddate AS NVARCHAR(255)) + '_chukushu]' FROM (SELECT DISTINCT ddate FROM cailiao_zjh) AS Dates ORDER BY ddate; -- print @ColumnList -- 动态生成最终的 SQL 语句 SET @DynamicSQL = ' SELECT cun_huo_bian_ma, cinvname, cInvStd, dong_ji_da_lei_ming_cheng, huan_suan_lv, jin_liao_pi_hao, lu_hao, chang_du, xin_chu_wei, xiancunliang_kg, xiancunliang, gong_ying_shang, cinvmnemcode, qimojiechunshuliang, qimojiechunshuliang_kg,
cun_huo_ming_cheng_jian_cheng, gui_ge_jian_cheng, ' + @ColumnList + ' FROM cailiao_zjh GROUP BY cun_huo_bian_ma, cinvname, cInvStd, dong_ji_da_lei_ming_cheng, huan_suan_lv, jin_liao_pi_hao, lu_hao, chang_du, xin_chu_wei, xiancunliang_kg, xiancunliang, gong_ying_shang, cinvmnemcode, qimojiechunshuliang, qimojiechunshuliang_kg,
cun_huo_ming_cheng_jian_cheng, gui_ge_jian_cheng; '; --print @DynamicSQL -- 执行动态 SQL 语句 EXEC sp_executesql @DynamicSQL; sqlserver,上面的sql逻辑不变。 在 'SUM(CASE WHEN ddate = ''' + CAST(ddate AS NVARCHAR(255)) + ''' THEN chukushu ELSE 0 END) AS [' + CAST(ddate AS NVARCHAR(255)) + '_chukushu]' 这个逻辑上。 在加一个动态字段,rukushu 逻辑和上面一样
要实现在现有动态 SQL 中添加 `rukushu` 动态字段,需在生成列名列表时同步构建 `chukushu` 和 `rukushu` 的聚合逻辑。以下是修改后的完整代码及关键步骤说明:
---
修改后的完整代码
```sql
-- 声明变量
DECLARE @DynamicSQL NVARCHAR(MAX);
DECLARE @ColumnList NVARCHAR(MAX);
-- 动态生成列名列表(同时包含 chukushu 和 rukushu)
SELECT @ColumnList = COALESCE(@ColumnList + ', ', '') +
'SUM(CASE WHEN ddate = ''' + CAST(ddate AS NVARCHAR(255)) + ''' THEN chukushu ELSE 0 END) AS [' + CAST(ddate AS NVARCHAR(255)) + '_chukushu], ' +
'SUM(CASE WHEN ddate = ''' + CAST(ddate AS NVARCHAR(255)) + ''' THEN rukushu ELSE 0 END) AS [' + CAST(ddate AS NVARCHAR(255)) + '_rukushu]'
FROM (SELECT DISTINCT ddate FROM cailiao_zjh) AS Dates
ORDER BY ddate;
-- 动态生成最终 SQL 语句
SET @DynamicSQL = '
SELECT
cun_huo_bian_ma,
cinvname,
cInvStd,
dong_ji_da_lei_ming_cheng,
huan_suan_lv,
jin_liao_pi_hao,
lu_hao,
chang_du,
xin_chu_wei,
xiancunliang_kg,
xiancunliang,
gong_ying_shang,
cinvmnemcode,
qimojiechunshuliang,
qimojiechunshuliang_kg,
cun_huo_ming_cheng_jian_cheng,
gui_ge_jian_cheng,
' + @ColumnList + '
FROM cailiao_zjh
GROUP BY
cun_huo_bian_ma,
cinvname,
cInvStd,
dong_ji_da_lei_ming_cheng,
huan_suan_lv,
jin_liao_pi_hao,
lu_hao,
chang_du,
xin_chu_wei,
xiancunliang_kg,
xiancunliang,
gong_ying_shang,
cinvmnemcode,
qimojiechunshuliang,
qimojiechunshuliang_kg,
cun_huo_ming_cheng_jian_cheng,
gui_ge_jian_cheng;';
-- 执行动态 SQL
EXEC sp_executesql @DynamicSQL;
```
---
关键修改说明
1. 动态列生成逻辑扩展
在 `@ColumnList` 的构建中,每个 `ddate` 对应的聚合逻辑从单字段(`chukushu`)扩展为双字段(`chukushu` 和 `rukushu`)。通过在 `COALESCE` 中串联两个 `SUM(CASE)` 表达式,生成形如:
``` ```sql
[ddate_chukushu], [ddate_rukushu]
```
2. 列名格式一致性
新增的 `rukushu` 列名遵循与 `chukushu` 相同的命名规则(`ddate_字段名`),确保结果集结构清晰。
3. GROUP BY 子句无需修改
新增的聚合字段(`rukushu`)是通过 `SUM` 聚合生成的,无需在 `GROUP BY` 中添加额外列。
---
验证与注意事项
- 测试输出:可通过 `PRINT @ColumnList` 和 `PRINT @DynamicSQL` 检查生成的 SQL 语句是否符合预期。
- 性能优化:若 `ddate` 值较多,建议优化 `DISTINCT` 查询或添加索引以提升动态列生成效率。
- 安全增强:若 `ddate` 来源不可控,建议使用参数化查询避免 SQL 注入风险(当前代码假设 `ddate` 为可信数据)。
此方案在保持原有逻辑的基础上,通过扩展动态列生成逻辑,高效实现了 `rukushu` 字段的动态聚合需求。
- 上一篇: SQL入门基础-如何串联拼接多列的值?
- 下一篇: SQL 中的 (+)用法(sql ||是什么)
猜你喜欢
- 2025-07-08 SQL中的EXISTS函数你有用过吗?(oracle数据库exists函数用法)
- 2025-07-08 美团面试特有:写个 SQL 语句然后问加了哪些锁
- 2025-07-08 数据库系统原理:数据插入(数据库插数据语句)
- 2025-07-08 Rust的数据库框架:SQLx连接MySQL实践
- 2025-07-08 10W 行级别数据的 Excel 导入优化记录
- 2025-07-08 excel批量生成sql脚本(excel批量生成数据)
- 2025-07-08 数据库教程-SQL Server查询结果列转行实现与分析
- 2025-07-08 SQL 中的 (+)用法(sql ||是什么)
- 2025-07-08 SQL入门基础-如何串联拼接多列的值?
- 2025-07-08 SQL 如何进行并集、交集、差集等集合运算
- 最近发表
- 标签列表
-
- xml (46)
- css animation (57)
- array_slice (60)
- htmlspecialchars (54)
- position: absolute (54)
- datediff函数 (47)
- array_pop (49)
- jsmap (52)
- toggleclass (43)
- console.time (63)
- .sql (41)
- ahref (40)
- js json.parse (59)
- html复选框 (60)
- css 透明 (44)
- css 颜色 (47)
- php replace (41)
- css nth-child (48)
- min-height (40)
- xml schema (44)
- css 最后一个元素 (46)
- location.origin (44)
- table border (49)
- html tr (40)
- video controls (49)