【问题标题】:Create unique list from 2 columns and sum values per row based on that unique list from 2 value columns从 2 列创建唯一列表,并根据 2 个值列中的唯一列表对每行的值求和
【发布时间】:2021-10-26 13:20:39
【问题描述】:

浏览了许多帖子后,我仍在努力为我试图从 MS Excel 转换到 PowerBI 的报告找到解决方案。

问题

在 PowerBI 的报告部分创建一个表格,该表格具有唯一的货币列表(基于 2 列)及其对应的 FXexposure,它们是基于 2 列中的每个货币边定义的。下面我展示了我在 Excel 中使用的源数据和工作原理,我正在尝试复制它们。

源数据(来自数据库表)

a b d d e f g
Instrument Currency 1 Currency 2 FX nominal 1 FX nominal 2 FXNom1 - Gross FXNom2 - Gross
FWD EUR/USD EUR USD -7.965264529 7.90296523 7.97 7.90
FWD USD/JPY USD JPY 1.030513307 -1.070305687 1.03 1.07
Instrument 1 USD 1.75862819 1.76 0.00
Instrument 2 USD TRY 0 3.45E-04 0.00 0.00
Instrument 3 JPY 1.121782037 1.12 0.00
Instrument 4 EUR 6.2505079 6.25 0.00
FWD EUR/CNH EUR CNH 0.007591392 3.00E-09 0.01 0.00
Instrument 5 RUB 6.209882675 6.21 0.00

F2 = ABS(FX 标称 1) G2 = ABS(FX 标称 2)

在 excel 中报告输出

a b c d e
FX Long Short Net **Gross **
0 0.00 0.00 0.00 0.00
RUB 6.21 0.00 6.21 6.21
EUR 6.26 -7.97 -1.71 14.22
JPY 1.12 -1.07 0.05 2.19
USD 10.69 0.00 10.69 10.69
CNH 0.00 0.00 0.00 0.00
TRY 0.00 0.00 0.00 0.00

下面是我的 Excel 公式,用于重新创建我正在寻找的内容。

A2:  =IFERROR(LOOKUP(2, 1/(COUNTIF(Report!$A$1:A1,Data!$B$2:$B$553)=0), Data!$B$2:$B$553), LOOKUP(2, 1/(COUNTIF(Report!$A$1:A1, Data!$C$2:$C$553)=0), Data!$C$2:$C$553))

B2: =((SUMIFS(Data!$D$2:$D$553, Data!$B$2:$B$553, Report!$A2, Data!$D$2:$D$553, ">0"))+(SUMIFS(Data!$E$2:$E$553, Data!$C$2:$C$553, Report!$A2, Data!$E$2:$E$553, ">0")))

C2: =((SUMIFS(Data!$D$2:$D$553, Data!$B$2:$B$553, Report!$A3, Data!$D$2:$D$553, "<0"))+(SUMIFS(Data!$E$2:$E$553, Data!$C$2:$C$553, Report!$A3, Data!$E$2:$E$553, "<0")))

D2: =(SUMIF(Data!$B$1:$B$553,Report!$A3,Data!$D$1:$D$553)+SUMIF(Data!$C$1:$C$553,Report!$A3,Data!$E$1:$E$553))

E2: =(SUMIF(Data!$B$1:$B$554,Report!$A3,Data!$F$1:$F$554)+SUMIF(Data!$C$1:$C$554,Report!$A3,Data!$G$1:$G$554))

现在我相信我已经设法通过使用 UNIQUE/SELECTCOLUMNS 函数找到了一个 hack,但是当您尝试绘制输出图形时,它非常小(就好像它试图在幕后找到其他数据一样) .请注意,我倾向于过滤日期以获得我需要的输出(这是使用跨其他数据表的关系映射的)。

FX =
DISTINCT (
UNION (
SELECTCOLUMNS ( DATA, "Date", [DATE], "Currency", [CURRENCY1],  "FXNom", [FXNOMINAL1] ),
SELECTCOLUMNS ( DATA, "Date", [DATE], "Currency", [CURRENCY2], ,"FXNom", [FXNOMINAL2] )
)
)

如果有人有任何想法,我将非常感激,因为我仍然觉得我的解决方法更像是一个幸运的黑客。

谢谢!

【问题讨论】:

  • 那么,它是在寻找“幕后的其他数据”还是其他什么问题?
  • 嘿山姆。我不是更多的“幕后数据”,更可能是我让它工作的尝试并不完美。因此看看其他人是否会尝试另一种方式。
  • 那么,D 或 E 中的负数是空头,D 或 E 中的正数是多头,净 = 空头 + 多头,毛 = 绝对值(空头)+ 绝对值(多头)?
  • 您的方法在我看来是正确的。我不认为你会想要 DISTINCT。尽管重复值不太可能具有如此高的精度,但您不希望将两个相同的位置压缩为一个。我想知道您的图表是否看起来很小,因为您期望跨日期的累积值?您需要为这样的聚合值创建另一个度量。

标签: excel powerbi dax powerbi-desktop


【解决方案1】:

您使用的方法看起来几乎是理想的。从维度模型的角度来看,您需要一列用于值,一列用于货币标签。因此,选择这些对作为不同的表并附加 UNION 是正确的方法。一般来说,我认为最好在 power query 中进行所有可以进行的转换,以这种方式使用 DAX 会导致一些限制。

但如果我们使用 DAX,我确实认为您想摆脱 DISTINCT。这可能会导致相同的位置折叠成一行,这样您就会丢失数据。

FX = 
UNION (
    SELECTCOLUMNS ( FX_Raw, "Date", "FakeDate", "Currency", [CURRENCY 1], "FXNom", [FX nominal 1] ),
    SELECTCOLUMNS ( FX_Raw, "Date", "FakeDate", "Currency", [CURRENCY 2], "FXNom", [FX nominal 2] )
)

然后是一些措施:

Long = 
   CALCULATE(sum(FX[FXNom]), FX[FXNom] >= 0)
Short = 
   CALCULATE(sum(FX[FXNom]), FX[FXNom] < 0)
Gross = 
   SUMX( FX, if(FX[FXNom] > 0, FX[FXNom], 0-FX[FXNom]))
Net = 
   SUM(FX[FXNom])

似乎产生了预期的结果:

【讨论】:

  • 嗯,有道理。非常感谢你。这是我第一次阅读多个论坛并找出解决此问题的最佳方法 - 看起来我几乎就在那里......不过没有樱桃。如果我可以问一下,PowerQuery 的建议是什么?很高兴收到链接,我可以阅读它。
猜你喜欢
  • 2023-02-23
  • 2016-01-16
  • 2015-08-03
  • 1970-01-01
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 2020-03-10
相关资源
最近更新 更多