3

我有 2 个查询:

优质的:

在此处输入图像描述

和损失:

在此处输入图像描述

如何使用 DAX 简单地汇总 Premium 查询中的数据并将其 LEFT JOIN 到 Losses 查询中的汇总数据?

在 SQL 中是这样的:

declare @PremiumTable table (PolicyNumber varchar(50), Premium money)
insert into @PremiumTable values 
                                ('Pol1', 100),
                                ('Pol1', 50),
                                ('Pol2', 300),
                                ('Pol3', 500),
                                ('Pol3', 200),
                                ('Pol4',400)

declare @LossesTable table (PolicyNumber varchar(50), Losses money)
insert into @LossesTable values ('Pol1',115),
                                ('Pol1',25),
                                ('Pol2',0),
                                ('Pol3',110),
                                ('Pol3',75)


select  p.PolicyNumber, 
        sum(p.Premium) as Premium,
        sum(l.Losses)as Losses  
from @PremiumTable p 
        LEFT JOIN @LossesTable l on p.PolicyNumber = l.PolicyNumber
group by p.PolicyNumber

结果:

在此处输入图像描述

我尝试使用NATURALLEFTOUTERJOIN,但它给了我一个错误:

*An incompatible join column, (''[PolicyNumber]) was detected. 'NATURALLEFTOUTERJOIN' doesn't support joins by using columns with different data types or lineage.*

MyTable = 
    VAR Premium = 
            SELECTCOLUMNS(
                fact_Premium,
                "PolicyNumber",fact_Premium[PolicyNumber],
                "Premium", fact_Premium[Premium]
                )
    VAR Losses = 
                SELECTCOLUMNS(
                    fact_Losses,
                    "PolicyNumber", fact_Losses[PolicyNumber],
                    "Losses", fact_Losses[PaymentAmount]
                             )
    VAR Result = NATURALLEFTOUTERJOIN(Premium,Losses)
    RETURN Result
4

2 回答 2

5

VAR变量 ( )的使用存在一些相互依赖的“错误”或限制,NATURALLEFTOUTERJOIN这使得调试起来很奇怪。

一些值得注意的限制是:

VAR

不能通过 TableName[ColumnName] 语法引用表变量中的列。

NATURALLEFTOUTERJOIN

任何一个:

必须在应用连接之前定义两个表之间的关系,并且定义关系的列的名称需要不同。

或者:

为了连接两个具有相同名称且没有关系的列,这些列必须具有数据沿袭

(我有点困惑,因为提到的链接do not have a data lineage;虽然官方文档说只有来自同一源表(具有相同的血统)的列才加入。)


回到这个案例。

  1. SUMMARIZE应该使用而不是SELECTCOLUMNS获取Premium和的汇总表Losses,即:

    Premium = 
    SUMMARIZE(
        fact_Premium,
        fact_Premium[PolicyNumber],
        "Premium", SUM(fact_Premium[Premium])
    )
    
    Losses = 
    SUMMARIZE(
        fact_Losses,
        fact_Losses[PolicyNumber],
        "Losses", SUM(fact_Losses[Losses])
    )
    
  2. 当我们应用NATURALLEFTOUTERJOIN上述两个表时,No common join columns detected由于它们没有建立关系,它会返回错误。

在此处输入图像描述

  1. 为了解决这个问题,我们可以按照这篇博文中的TREATAS建议使用。但是要使用,我们必须引用和表中的列名,所以我们不能使用来声明它们,而必须实际实例化它们。TREATASPremiumLossesVAR

总而言之,解决方案是:

  1. Premium为和Losses如上所述创建计算表。

优质的

损失

  1. 用于TREATAS模拟数据沿袭并Premium与之连接表Losses_TreatAs

    MyTable = 
    VAR Losses_TreatAs = TREATAS(Losses, Premium[PolicyNumber], Losses[Losses])
    RETURN NATURALLEFTOUTERJOIN(Premium, Losses_TreatAs)
    

结果:

结果

于 2018-07-20T09:47:25.077 回答
1

你好,我建议你这样:

在 PowerQuery 中,建立一个带有 policyNumber 的表,如下所示:

  1. 复制溢价表,并删除重复项上的溢价列。称之为 PremiumPol
  2. 复制损失表,并删除重复的损失列。称之为 LossesPol
  3. 然后使用 Append Query 按钮追加 PremiumPol 和 LossesPol。称它为policynumber
  4. 最后从附加表中删除重复项
  5. 然后点击关闭并应用

检查您的模型是否是这样的: 在此处输入图像描述

然后,在保单基础上添加损失和溢价是微不足道的,继续并选择一个表格视觉和这些字段: 在此处输入图像描述

结果是这样的:

在此处输入图像描述

希望有帮助!

于 2018-07-20T09:31:09.837 回答