无需修改数据表,基于一对多关联SQL表获取聚合数据咨询
问题:无需修改数据表实现按real_name和region统计units总和?
需求背景
需要从region_data表按real_name和region分组统计units的总和,其中real_name需通过item_code关联item_lookup表获取。现有方案需要修改region_data表新增列,希望找到不修改原表的实现方式。
region_data表结构
| item_code | short_code | region | units |
|---|---|---|---|
| B2513-70 | Brash | East | 18 |
| C2692-59 | Scope | East | 100 |
| C2692-59 | Scope | North | 94 |
| A6152-94 | Chunk | South | 70 |
| C2692-59 | Scope | West | 40 |
| A4891-91 | Topic | East | 65 |
| ... | ... | ... | ... |
注:item_code为关联item_lookup表的字段
item_lookup表结构
| item_code | real_name |
|---|---|
| B2513-70 | Oven |
| C2692-59 | Oven |
| F6940-84 | Music |
| A4891-91 | Music |
| E6031-11 | Music |
| B2007-23 | Hotel |
| D6228-48 | Hotel |
| F3679-48 | Ladder |
| E3587-36 | Ladder |
| A6152-94 | Ladder |
注:10个唯一item_code对应4个唯一real_name
现有修改数据表的方案
分为三步:
- 新增列:给
region_data表添加rn列
-- 给region_data表添加列 ALTER TABLE region_data ADD COLUMN rn text;
- 更新列数据:从
item_lookup表同步real_name到rn列
-- 从item_lookup表更新region_data的rn列 update region_data rd set rn = lu.real_name from item_lookup lu where rd.item_code = lu.item_code;
- 生成汇总结果:按
rn和region分组统计
-- 按real_name、region生成汇总表 select rn, region, sum(units) from region_data group by rollup(rn, region)
核心疑问
是否可以通过关联item_code与real_name的查询,无需修改region_data表就能实现按real_name和region分组统计units总和的需求?
解决方案
当然可以,直接通过JOIN关联两张表后进行分组统计即可,无需修改原表。SQL语句如下:
select lu.real_name, rd.region, sum(rd.units) as total_units from region_data rd join item_lookup lu on rd.item_code = lu.item_code group by rollup(lu.real_name, rd.region)
说明
- 使用
JOIN将region_data与item_lookup通过item_code关联,直接获取对应的real_name - 分组时直接用
lu.real_name替代原方案中的新增列rn ROLLUP函数保持原逻辑,生成包含层级汇总的结果- 如果存在
region_data中item_code在item_lookup中无匹配的情况,可根据需求改用LEFT JOIN,此时无匹配的real_name会显示为NULL
内容的提问来源于stack exchange,提问作者Andrew Staroscik
相关产品推荐
相关产品推荐

