列的SUM条件为另一列的许多值

时间:2017-04-03 12:47:58

标签: powerbi

我正在努力完成某些事情,但不知道该怎么做。

我有一个Dimension(表称为TEntry),代表员工的时间条目,如:

    Id | EmployeeId | EntryDT    | TimeInMinutes | PriceAgreementId
------ | ---------- | ---------- | ------------- | ----------------
    1  | 1          | 2017-03-20 | 100           | 1
    2  | 1          | 2017-03-31 | 50            | null
    3  | 2          | 2017-03-21 | 100           | 1
    4  | 2          | 2017-03-23 | 125           | 2
    5  | 3          | 2017-03-15 | 90            | null
    6  | 3          | 2017-03-25 | 60            | 1

有时他们会在" PriceAgreements"上工作,有时他们不会。

在我的仪表板中,我有一个表,它将表TEntry分组为EmployeeId并对TimeInMinutes求和。我还有一个EntryDT切片器:

    EmployeeId | TimeInMinutes
-------------- | -------------
    1          | 150
    2          | 225
    3          | 150

我需要创建2个代表以下的新列:

  1. 一个员工的总TimeInMinutes已经处理了所有PriceAgreements 因此,对于EmployeeId#1,Total将为100。
  2. 总TimeInMinutes所有员工都有效,但仅适用于当前员工(当前行)的PriceAgreements。
  3. 表格看起来像这样(括号中没有PriceAgreementIds):

        EmployeeId | TimeInMinutes | TimeInMinutes on PriceAgreements | TimeInMinutes on PriceAgreements ALL other EmployeeIds
    -------------- | ------------- | -------------------------------- | ------------------------------------------------------
        1          | 150           | 100 (PriceAgreementId=1)         | 260 (PriceAgreementId=1)
        2          | 225           | 225 (PriceAgreementId=1 and 2)   | 385 (PriceAgreementId=1 and 2)
        3          | 150           | 150 (PriceAgreementId=1)         | 260 (PriceAgreementId=1)
    

    Column" PriceAgreements" TimeInMinutes很容易,但另一个,我找不到解决方案......

    我开始使用这个DAX表达式,但它不完整:

    CALCULATE(SUM(TEntry[TimeInMinutes]), NOT ISBLANK(TEntry[PriceAgreementId]), ALL(TEmployee))
    

    TEmployee是一个链接到主TEntry表的维度。

    任何帮助将不胜感激。 谢谢

1 个答案:

答案 0 :(得分:1)

我把它作为一个答案,因为(a)它可能让你(或其他人)朝着正确的方向前进,(b)如果它得到保证一个员工只会有2个价格协议的时间条目,这样就可以了 - 这对你来说不太可能,但对于其他人来说也可能就是这样。

Measure =
CALCULATE (
SUM ( TEntry[TimeInMinutes] ),
  FILTER (
    ALL ( TEntry ),
    (
        TEntry[PriceAgreementID] = MIN ( TEntry[PriceAgreementID] )
            || TEntry[PriceAgreementID] = MAX ( TEntry[PriceAgreementID] )
    )
        && TEntry[PriceAgreementID] <> BLANK ()
  )
)

此度量是:对于TEntry表中的所有记录,使用TimeInMinutes,其中PriceAgreementID与最小OR最大PriceAgreementID(在当前行的上下文中)匹配,而PriceAgreementID不是空白。

这个答案的致命缺陷是MIN和MAX。对于具有2个PriceAgreementID(1&amp; 2)的员工ID 2,MIN将计算PriceAgreementID 1的分钟数,MAX将计算PriceAgreementID 2的分钟数。但是,要扩展到可能超过2的情况PriceAgreements ...我不知道该怎么做。

但它确实适用于您问题中的示例数据(因为每位员工最多有2个价格协议):

Result using a measure on the sample data above - which an employee is limited to 2 price agreements

通常,当我遇到这样的问题并不容易解决时,我会考虑我的数据模型,并确保它尽可能地符合星型模式。

在您的情况下,员工可以签订多个价格协议,价格协议可以与许多员工相关联。对我而言,这表明了一种多对多的关系。我强烈建议您阅读更多关于多对多关系的内容,以及重组基础表格(例如,包括桥接表)是否有助于您更接近所需的答案。

一个好的起点可能是:https://www.sqlbi.com/articles/many-to-many-relationships-in-power-bi-and-excel-2016/