如何关联主表与属性表并将多行属性转换为列生成目标报表
基于双表关联创建报表的需求
我需要基于两个数据源搭建报表,其中Table1为主表,Table2为属性表,想要确认是否可以通过两表关联,生成指定结构的结果表。
Table1(主表数据)
| ID | NUM |
|---|---|
| A | 1 |
| B | 1 |
| B | 2 |
Table2(属性表数据)
| ID | NUM | ATTR | VAL |
|---|---|---|---|
| A | 1 | ATR1 | BLUE |
| A | 1 | ATR2 | GREEN |
| A | 1 | ATR3 | RED |
| B | 2 | ATR1 | WHITE |
| B | 2 | ATR2 | PINK |
| B | 2 | ATR3 | RED |
期望生成的结果表
| ID | NUM | ATTR1 | ATTR2 | ATTR3 |
|---|---|---|---|---|
| A | 1 | BLUE | GREEN | RED |
| B | 2 | WHITE | PINK | RED |
非常感谢!
实现方案
这个需求完全可以实现,核心操作分为多表关联匹配+属性行转列两步,不同工具下的具体操作路径如下:
- 用SQL类工具实现
- 以
ID + NUM作为联合关联键,将主表Table1和属性表Table2做左连接 - 通过条件判断把属性表中逐行存储的ATTR值转成独立的列头,对应存储VAL的取值
- 过滤掉无匹配属性值的空记录(比如Table1中
B+NUM=1的行,因为Table2中无对应属性数据,自然不会出现在最终结果中)
参考实现代码:
SELECT t1.ID, t1.NUM, MAX(CASE WHEN t2.ATTR = 'ATR1' THEN t2.VAL END) AS ATTR1, MAX(CASE WHEN t2.ATTR = 'ATR2' THEN t2.VAL END) AS ATTR2, MAX(CASE WHEN t2.ATTR = 'ATR3' THEN t2.VAL END) AS ATTR3 FROM Table1 t1 LEFT JOIN Table2 t2 ON t1.ID = t2.ID AND t1.NUM = t2.NUM WHERE t2.ATTR IS NOT NULL GROUP BY t1.ID, t1.NUM - 以
- 用BI报表工具实现
- 在数据配置页设置两个表的关联关系,关联键同样为
ID+NUM - 将Table2的
ATTR字段拖入列展示区域,VAL字段拖入指标展示区,工具会自动完成行转列生成宽表结构 - 将主表的
ID、NUM字段拖入行展示区域,调整字段名称后即可得到目标结果表
- 在数据配置页设置两个表的关联关系,关联键同样为
内容的提问来源于stack exchange,提问作者Sandeepreddy Q
相关产品推荐
相关产品推荐

