PowerBI中利用Unpivot实现多组system与rating列的匹配转换
解决方案:将宽表转换为窄表(配对system与rating并过滤null)
先明确你的原表和目标表结构:
原表
| NAME | system 1 | system 2 | system 3 | rating 1 | rating 2 | rating 3 |
|---|---|---|---|---|---|---|
| papa | abc | abd | abe | 50 | 25 | 25 |
| mama | abc | abd | null | 50 | 50 | null |
目标表
| NAME | system | rating |
|---|---|---|
| papa | abc | 50 |
| papa | abd | 25 |
| papa | abe | 25 |
| mama | abc | 50 |
| mama | abd | 50 |
你猜的没错,核心就是逆透视(Unpivot),下面分两种常用场景给出具体操作:
场景1:用Excel Power Query(可视化操作)
- 选中原数据区域,点击「数据」选项卡 → 「从表格/区域」,确认导入后进入Power Query编辑器
- 按住Ctrl键,成对选中列:先选
system 1+rating 1,再选system 2+rating 2,最后选system 3+rating 3 - 点击顶部「转换」选项卡 → 「逆透视列」→ 「逆透视列(成对)」
- 此时会生成多余的
Attribute.1列,直接选中它右键删除 - 点击
system列的筛选按钮,取消勾选「null」;原数据中rating的null和system的null是配对的,过滤system的null即可 - 点击「关闭并上载」,就能得到目标表
场景2:用SQL(以SQL Server为例)
推荐用CROSS APPLY的方式,比嵌套Unpivot更直观好理解:
SELECT t.NAME, s.system, s.rating FROM your_table_name t CROSS APPLY ( -- 把每行的3组system和rating拆成3行 VALUES (t.[system 1], t.[rating 1]), (t.[system 2], t.[rating 2]), (t.[system 3], t.[rating 3]) ) s(system, rating) -- 过滤掉system或rating为null的行 WHERE s.system IS NOT NULL AND s.rating IS NOT NULL;
如果一定要用UNPIVOT语法,也可以这么写:
SELECT NAME, system, rating FROM ( SELECT NAME, system1 = [system 1], rating1 = [rating 1], system2 = [system 2], rating2 = [rating 2], system3 = [system 3], rating3 = [rating 3] FROM your_table_name ) t UNPIVOT ( system FOR sys_col IN (system1, system2, system3) ) up_sys UNPIVOT ( rating FOR rat_col IN (rating1, rating2, rating3) ) up_rat WHERE system IS NOT NULL AND rating IS NOT NULL -- 确保system和rating的组对应(比如system1对应rating1) AND RIGHT(sys_col, 1) = RIGHT(rat_col, 1);
内容的提问来源于stack exchange,提问作者luibrain
相关产品推荐
相关产品推荐

