财务月报、地区对照表经常要在「长表」和「宽表」之间切换:明细是地区 + 月份 + 金额一行一条,汇报却要地区做行、月份做列、格子里求和;反过来,已经摊成「1月、2月、3月」各一列的宽表,要收成「月份 + 金额」才能继续按月汇总或做同比。

如果采用传统手工方式,只能反复拉数据透视表,或把月份列逐个复制粘贴成竖表。缺一个月份、多一个状态列,手工透视就要重做;源表一被改,宽表与长表立刻对不上。过程无法沉淀为可回溯、可自动复跑的工作流。

DT-Bot 的 「透视反透视」 算子专为解决此类长表与宽表互换而设计。它把工作空间里的一张表写成一张新表:透视做交叉汇总,反透视收成名称列 + 值列。源表只读。未点名时新表名为「源表名_透视」或「源表名_反透视」。按维度汇总但列集合不变,请用「聚合计算」;整表行变列、不聚合,请用「行列转置」。

一、 核心能力与适用场景

「透视反透视」算子聚焦于一张表的长宽结构转换,覆盖以下三大核心能力:

核心能力 解决什么业务问题 典型业务场景
透视(长表变宽表) 指定谁做行、谁做列、格子填哪一列、怎么聚合,得到交叉表。 按地区做行、月份做列,金额求和;各状态各一列,格子里计数或求平均。
反透视(宽表变长表) 把若干度量列收成「名称列 + 值列」,其余列作为保留维度。 把 1月、2月、3月 收成「月份 + 金额」,再往下按月计算。
指定结果名 交叉表要落成业务可识别的表名,而不是默认「源表名_透视」。 同一套地区×月份求和,输出「地区月报」。

不写聚合时默认求和。也可以计数、平均、最大、最小。列头取值超过 256 种会拒绝。一次展开两个列维、或同时摊两列度量,本节点做不到。

二、 边界指南:它与相近算子有何区别?

在构建数据工作流时,理解算子之间的职责边界至关重要:

比较维度 「透视反透视」算子 「聚合计算」算子 「行列转置」算子 「单元格拆行」算子
主要定位 长宽表互换(交叉汇总或名称+值) 分组压行,列集合不变 整表行变列、不聚合 一格拆成多行,仍是一张明细
输出机制 源表只读,另写透视/反透视表 源表只读,另写短表 写出转置表 行数变多,不是交叉宽表
典型动作 地区做行、月份做列;1月/2月竖起来 按地区合计金额,月份仍是值不是列头 整表行列对调 逗号分隔的一格拆多行
如何选择 “要交叉宽表,或把月份列收成名称+值” “只要分组短表,不要把月份摊成列头” “整表转置,格子里不求和” “拆的是单元格文本,不是列维”

三、 提示词编写规范与公式

「透视反透视」算子支持自然语言直接表达,建议遵循以下标准的三要素编写公式:

【目标表】 + 【透视:行 / 列 / 值 / 聚合;或反透视:收哪些列、名称列与值列叫什么】 + 【结果表名(可选)】

1. 目标表范围表达

  • 单表精准点名:例如 把 “销售明细” ...、把 “月度宽表” ...;
  • 默认当前流转表:未显式提及表名时,继承上一节点连线流入的数据表。

2. 结构怎么写

  • 透视:写清谁做行、谁做列、格子填哪一列、怎么聚合。不写聚合时默认求和。也可以计数、平均、最大、最小;
  • 反透视:写清收哪些列、新名称列和值列叫什么。也可以写成「除姓名外都竖起来」,结果与点名 1月、2月、3月相同;
  • 限制:一次展开两个列维、或同时摊两列度量,本节点做不到;列头取值超过 256 种会拒绝。

3. 结果名

  • 点名则用你写的表名(如「地区月报」);不写则为「源表名_透视」或「源表名_反透视」。源表只读。
把 “销售明细” 按地区做行、月份做列,金额求和。

对应三段:表是销售明细;透视行=地区、列=月份、值=金额、聚合=求和;结果默认「销售明细_透视」。

四、 核心功能与图解实战

以下结合真实企业数据场景,展示「透视反透视」在不同需求下的处理效果:

场景 1:透视(长表变交叉宽表)

业务背景:财务要把销售明细收成「地区 × 月份」交叉表,格子里是金额求和。华东 1 月有两笔,必须先加总再进格子,而不是只留其中一笔。

【处理前:销售明细】

地区 月份 金额
华东 1月 100
华东 1月 20
华东 2月 80
华北 1月 50
华北 2月 70

【执行提示词】

把 “销售明细” 按地区做行、月份做列,金额求和。

【处理后:销售明细_透视(新表;源表只读)】

地区 1月 2月 变更说明
华东 120 80 1 月 100 + 20 = 120;2 月仅 80
华北 50 70 各月各一笔

逻辑详解:未点名结果表,新表名为「销售明细_透视」。不写聚合时默认求和。源表五行只读。也可以计数、平均、最大、最小。列头取值超过 256 种会拒绝。


场景 2:反透视(宽表收成名称 + 值)

业务背景:月度宽表已经是「1月、2月、3月」各一列,下游同比与累计都要求「月份 + 金额」长表。李四 2 月为 0 也要留下,不能当空列丢掉。

【处理前:月度宽表】

姓名 1月 2月 3月
张三 10 20 30
李四 5 0 15

【执行提示词】

把 “月度宽表” 的 1月、2月、3月 反透视成月份和金额。

【处理后:月度宽表_反透视(新表)】

姓名 月份 金额 变更说明
张三 1月 10 宽表 1 月列竖起来
张三 2月 20
张三 3月 30
李四 1月 5
李四 2月 0 0 仍保留为一行
李四 3月 15

逻辑详解:未点名结果表,新表名为「月度宽表_反透视」。姓名作为保留列,1月/2月/3月变成「月份」与「金额」。也可以写成「除姓名外都竖起来」,结果一样。源表只读。


场景 3:指定结果名(同一套透视,表名叫「地区月报」)

业务背景:交叉表要直接叫「地区月报」交给业务,不能停在默认的「销售明细_透视」,以免下游选错表。

【处理前:销售明细】

地区 月份 金额
华东 1月 100
华东 1月 20
华东 2月 80
华北 1月 50
华北 2月 70

【执行提示词】

把销售明细按地区做行、月份做列,金额求和,输出 “地区月报”。

【处理后:地区月报(新表)】

地区 1月 2月 变更说明
华东 120 80 与场景 1 同一套交叉汇总
华北 50 70 仅表名按提示词落成「地区月报」

逻辑详解:聚合口径与场景 1 相同,区别只在结果表名。源表「销售明细」仍只读,不会被「地区月报」覆盖。

五、 常见问题与操作贴士(FAQ)

Q1:不写聚合方式时,格子里按什么算?

答:默认求和。也可以计数、平均、最大、最小,须在提示词里写清。华东 1 月两笔 100 与 20,求和后格子是 120。

Q2:为什么提示「列头取值超过 256 种会拒绝」?

答:透视的列维会变成表头。取值种类过多时交叉表会过宽,本节点会拒绝执行。请先收敛列维(例如先「筛选器」或「聚合计算」),再透视。

Q3:一次把两个列维都摊开,或同时摊两列度量,行吗?

答:本节点做不到。 一次只展开一个列维、摊一列度量。需要更复杂的查询请用 「NP-SQL」。

Q4:和「聚合计算」「行列转置」怎么选?

答:按维度汇总但列集合不变(月份仍是值,不是列头)请用 「聚合计算」。整表行变列、不聚合请用 「行列转置」。一格拆成多行请用 「单元格拆行」。

六、 关联算子导航