2015-07-21 31 views
3

我一直在想这应该是容易的,但答案是在回避我。在Excel Power Query中,我想根据另一列的值来转换列的每一行中的值。例如,假设我有表1如下:电源变换查询基于列的另一列

Column A | Column B 
------------------- 
X  | 1 
Y  | 2 

我想变换基于在列B的值列A中的值,而不必添加新的列,并替换原始列A.我已尝试使用TransformColumns,但输入只能是目标列的值 - 我无法从TransformColumns函数内访问行/记录中的其他字段值。我会像能够做这样的事情:

=Table.TransformColumns(Table1, {"Column A", each if [Column B]=1 then "Z" else _ }) 

这将导致:

Column A | Column B 
------------------- 
Z  | 1 
Y  | 2 

我知道有很多方法可以做到这一点,但我试图找到一个用最少的步骤/转换。例如,我知道我可以使用Table.AddColumn基础上添加,着眼于B柱的函数 A列,但后来我不得不删除原来的列A,并与新的A柱取代它需要多额外的步骤。

回答

8

这里是我结束了这样做:

Table1: 
Column A | Column B 
------------------- 
X  | 1 
Y  | 2 

= Table.FromRecords(Table.TransformRows(Table1, 
    (r) => Record.TransformFields(r, 
     {"A", each if r[Column B]="1" then "Z" else _}))) 

结果:

Column A | Column B 
------------------- 
Z  | 1 
Y  | 2 

这种方式,你可以通过在Record.TransformFields功能使用嵌套表一次变换多列。

0

你不能用这样的步骤改造现有列。使用新列,进行转换,然后删除现有列。有什么大不了的?在Excel中,您不希望公式更改不同列的值。在Power Query中,公式的结果也存储在列中,并且不能是提供公式输入值之一的列。

+1

这笔交易主要是我必须用几个不同的表来做这件事,它感觉像是可以在1步vs几个(即创建新列,删除旧列,重命名新列)。此外,我必须对每个表执行多列操作,并且TransformColumns的优点在于它可以一次应用于多个列,而AddColumn则一次添加一个列。我有一个潜在的解决方案,将表转换为记录列表并使用稍后可以分享的Record.TransformFields。 – LoganTheSnowEater

+0

尽管如此,您仍然需要一个用于转换结果的新列。 – teylyn

1

荣誉给LoganTheSnowEater ...我爱你的答案。你提到,它可以在多个行动扩大,我想后如何我成功地用它做这样一个例子:

#"Patch Records" = Table.FromRecords(Table.TransformRows(#"Sorted Rows", 
(r) => Record.TransformFields(r, { 
    {"Min Commit", each 
     if r[service_id] = "21430" then 81 else 
     if r[service_id] = "24000" then 230 else 
     if r[service_id] = "24008" then 18 else 
     if r[service_id] = "24009" then 46.9 else 
     _}, 
    {"Installed", each 
     if r[service_id] = "21430" then 90 else 
     if r[service_id] = "24000" then 230 else 
     if r[service_id] = "24008" then 18 else 
     if r[service_id] = "24009" then 52 else 
     _}, 
    {"Requested", each 
     if r[service_id] = "21430" then 90 else 
     if r[service_id] = "24000" then 230 else 
     if r[service_id] = "24008" then 18 else 
     if r[service_id] = "24009" then 52 else 
     _}}))) 

我唯一令人惊讶的是,我不得不后重置所有数据类型我完成了,但回想起来这是有道理的。

p.s.我没有足够的信誉点将其作为解决方案的评论