【问题标题】:Group By and Average Flat Data in DataWeaveDataWeave 中的分组方式和平均平面数据
【发布时间】:2021-09-21 16:46:11
【问题描述】:

输入:

number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,2 qty
282,apple,red,today,3 qty, 
282,banana,yellow,yesterday,,
282,banana,yellow,yesterday,1 qty,

输出:

number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,2 qty
282,banana,yellow,yesterday,1 qty,

已尝试: 但出现此错误:无法将对象强制转换为字符串

(payload groupBy (key,index) ->(key.number ++ key.join_date)) mapObject {
   a: {
       number: $[0].number,
       fruit: $[0].fruit,
       colour: $[0].colour,
       join_date:$[0].join_date,
       avginqty: sum($.avginqty)/sizeOf($.avginqty),
       avgoutqty: sum($.avgoutqty)/sizeOf($.avgoutqty)
   }
}

【问题讨论】:

  • 您的输入在 3 之后有一个空格,而不是 "" 。这就是它应该的样子吗?同样,您的输出似乎与输入不一致。您是否试图将两行的平均值合并为一行的数量?
  • 嗨,Salim,我正在尝试根据 join_date 和数字获取平均数量。有时,行会有空值
  • 空应该用“”或“”一致表示,而不是混合。

标签: dataweave mule4


【解决方案1】:

使用以下输入

number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3,2
282,apple,red,today,3,
282,banana,yellow,yesterday,,
282,banana,yellow,yesterday,1,

并使用以下脚本

%dw 2.0
output application/csv
import * from dw::core::Arrays
---

(payload groupBy (key,index) ->(key.number ++ key.join_date)) mapObject {
   a: {
       number: $[0].number,
       fruit: $[0].fruit,
       colour: $[0].colour,
       join_date:$[0].join_date,
       avginqty: ($.avginqty sumBy (if($ == "") 0 else $))/sizeOf($.avginqty) ++ " qty",
       avgoutqty: ($.avgoutqty sumBy (if($ == "") 0 else $))/sizeOf($.avgoutqty) ++ " qty"    
   }
} pluck $

你会得到输出

number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,1 qty
282,banana,yellow,yesterday,0.5 qty,0 qty

在您之前的一个问题中(我已经回答了 4 个变体(其中一个场景确实解决了您的最后一个问题(如果输入有 qty 字符串作为数量的一部分)..但是您可以使用以下内容

输入

number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,2 qty
282,apple,red,today,3 qty,3 qty
282,banana,yellow,yesterday,2 qty,2 qty
282,banana,yellow,yesterday,1 qty,1 qty

脚本

%dw 2.0
output application/csv
import * from dw::core::Arrays
---

(payload groupBy (key,index) ->(key.number ++ key.join_date)) mapObject {
   a: {
       number: $[0].number,
       fruit: $[0].fruit,
       colour: $[0].colour,
       join_date:$[0].join_date,
       avginqty: ($.avginqty sumBy (if(($ splitBy " ")[0] == "") 0 else ($ splitBy " ")[0] as Number ))/sizeOf($.avginqty) ++ " qty",
       avgoutqty: ($.avgoutqty sumBy (if(($ splitBy " ")[0] == "") 0 else ($ splitBy " ")[0] as Number))/sizeOf($.avgoutqty) ++ " qty"    
   }
} pluck $

输出

number,fruit,colour,join_date,avginqty,avgoutqty
282,apple,red,today,3 qty,2.5 qty
282,banana,yellow,yesterday,1.5 qty,1.5 qty

如果您想跳过 qty 为 "" 的行进行平均计算。虽然这可能会导致在边缘情况下除以零错误,其中所有行的数量之一为“”

avginqty: ($.avginqty sumBy (if($ == "") 0 else $))/(sizeOf($.avginqty filter $ != "")) ++ " qty",
avgoutqty: ($.avgoutqty sumBy (if($ == "") 0 else $))/(sizeOf($.avgoutqty filter $ != "")) ++ " qty"

避免DBZ错误

avginqty: if((sizeOf($.avginqty filter $ != "")) != 0) ($.avginqty sumBy (if($ == "") 0 else $))/(sizeOf($.avginqty filter $ != "")) ++ " qty" else "", 
avgoutqty: if((sizeOf($.avgoutqty filter $ != "")) != 0) ($.avgoutqty sumBy (if($ == "") 0 else $))/(sizeOf($.avgoutqty filter $ != "")) ++ " qty" else ""

配置了不同输入的屏幕截图。 (所有值)

【讨论】:

  • 如果输入的 avginqty 列有 'qty'?
  • 那么它需要数量.. per if else 条件
  • 如果输入是例如,我在开头的意思是什么。 1 个,而不是 1 个
  • 我已经在您之前的一个问题中解决了这个问题。但是,我也用这种方法更新了上述答案。您将拆分条目(“”上的 1 个数量)并选择第一个元素并将其用作 Number 以在脚本中进行数学运算。
  • 好的,如果 avginqty 和 angoutqty 的 inout 为空,如何排除该行?排除这些行进行计算
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-04
  • 2016-08-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多