如何根据table_b的列匹配规则计算table_a对应列的求和值?
根据配置表动态计算行内列求和
数据表说明
table_a(业务数据表)
| id | cf_a | cf_b | cf_c | pv_a |
|---|---|---|---|---|
| 1 | 1 | 1 | 2 | 3 |
| 2 | 2 | 2 | 3 | 4 |
| 3 | 3 | 3 | 4 | 5 |
| 4 | 4 | 4 | 5 | 6 |
table_b(规则配置表)
| col | sum_cf | sum_pv |
|---|---|---|
| a | cf_a, cf_b, cf_c | pv_a |
预期输出
| id | sum_cf | sum_pv |
|---|---|---|
| 1 | 4 | 3 |
| 2 | 7 | 4 |
| 3 | 10 | 5 |
| 4 | 13 | 6 |
解决方案
由于sum_cf是存储在配置表中的动态列名列表,需要通过动态SQL实现需求,以下是主流数据库的实现示例:
MySQL 实现
SET @sum_cf = (SELECT sum_cf FROM table_b WHERE col = 'a'); SET @sum_pv = (SELECT sum_pv FROM table_b WHERE col = 'a'); SET @sql = CONCAT( 'SELECT id, ', REPLACE(@sum_cf, ', ', ' + '), ' AS sum_cf, ', @sum_pv, ' AS sum_pv ', 'FROM table_a' ); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
PostgreSQL 实现
DO $$ DECLARE sum_cf text; sum_pv text; sql_query text; BEGIN SELECT sum_cf, sum_pv INTO sum_cf, sum_pv FROM table_b WHERE col = 'a'; sql_query := 'SELECT id, ' || replace(sum_cf, ', ', ' + ') || ' AS sum_cf, ' || sum_pv || ' AS sum_pv FROM table_a'; EXECUTE sql_query; END $$;
逻辑说明
- 从配置表table_b中读取目标列名列表
sum_cf和PV列名sum_pv - 将逗号分隔的列名转换为
列1 + 列2 + 列3的求和表达式 - 拼接完整查询语句并执行动态SQL
内容的提问来源于stack exchange,提问作者jeyong kim
相关产品推荐
相关产品推荐

