You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Power BI中对指定列执行PIVOT/UNPIVOT操作?

实现数据集的PIVOT转换(长表转宽表)

你需要将包含用户-产品反馈的长格式数据表,转换为每个用户一行、产品作为列的宽格式表,以下是主流数据库的实现方案:

原始数据结构(推测)

每行记录对应一个用户对单个产品的反馈,列包括:id(用户ID)、name(用户名)、email(用户邮箱)、prod(产品标识,p1-p6)、feedback(反馈内容)

目标结果结构

每个用户一行,新增p1至p6列,对应该用户对对应产品的反馈,无反馈的列留空(或显示NULL)


方案1:SQL Server(原生PIVOT语法)

SELECT id, name, email, [p1], [p2], [p3], [p4], [p5], [p6]
FROM (
    -- 子查询获取源数据
    SELECT id, name, email, prod, feedback
    FROM your_table_name
) AS source_data
PIVOT (
    -- 聚合函数取反馈内容(因每个id+prod唯一,MAX/MIN/SUM均可)
    MAX(feedback) 
    -- 指定转置的列:将prod的取值转为结果列
    FOR prod IN ([p1], [p2], [p3], [p4], [p5], [p6])
) AS pivoted_result;

方案2:MySQL(无原生PIVOT,用CASE+GROUP BY实现)

SELECT 
    id,
    name,
    email,
    -- 对每个产品单独匹配反馈,无反馈返回NULL,用MAX聚合
    MAX(CASE WHEN prod = 'p1' THEN feedback END) AS p1,
    MAX(CASE WHEN prod = 'p2' THEN feedback END) AS p2,
    MAX(CASE WHEN prod = 'p3' THEN feedback END) AS p3,
    MAX(CASE WHEN prod = 'p4' THEN feedback END) AS p4,
    MAX(CASE WHEN prod = 'p5' THEN feedback END) AS p5,
    MAX(CASE WHEN prod = 'p6' THEN feedback END) AS p6
FROM your_table_name
-- 按用户唯一标识分组,确保每个用户只返回一行
GROUP BY id, name, email;

如果需要将NULL替换为空字符串,可改用COALESCE(MAX(CASE...), '') AS p1

方案3:PostgreSQL(使用crosstab函数)

首先需要启用tablefunc扩展(仅需执行一次):

CREATE EXTENSION IF NOT EXISTS tablefunc;

然后执行转置查询:

SELECT *
FROM crosstab(
    -- 源查询:按用户排序确保结果正确
    'SELECT id, name, email, prod, feedback FROM your_table_name ORDER BY 1',
    -- 指定要转置的产品列表
    'SELECT unnest(ARRAY[''p1'', ''p2'', ''p3'', ''p4'', ''p5'', ''p6''])'
) AS result_table(
    id INT, 
    name VARCHAR, 
    email VARCHAR, 
    p1 TEXT, 
    p2 TEXT, 
    p3 TEXT, 
    p4 TEXT, 
    p5 TEXT, 
    p6 TEXT
);

注意事项

  • 替换your_table_name为实际的表名,若列名与示例不符需对应调整
  • 无反馈的产品列默认返回NULL,可根据需求用COALESCE等函数替换为指定值

内容的提问来源于stack exchange,提问作者Rhea

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 21:15:33