我有2个查询:
高级:
和损失:
如何简单地汇总高级查询中的数据,然后使用DAX将其左联接以汇总到损耗查询中的数据?
在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
答案 0 :(得分:2)
关于变量(VAR
)和NATURALLEFTOUTERJOIN
的使用存在一些相互依赖的“错误”或局限性,这使得调试起来很奇怪。
一些值得注意的限制是:
VAR
:
表变量cannot be referenced中的列通过 TableName [ColumnName]语法。
NATURALLEFTOUTERJOIN
:
要么:
两个表之间的关系必须为defined before the join is applied,并且定义 关系需要不同。
或者:
为了连接两个具有相同名称且没有关系的列, 这些列必须位于have a data lineage。
(我有点困惑,因为链接提到了do not have a data lineage
;而官方文档中说,只有来自同一源表(have the same lineage)的列才被加入。)
回到这种情况。
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])
)
当我们将NATURALLEFTOUTERJOIN
应用于以上两个表时,由于它们没有建立关系,它将返回错误No common join columns detected
。
TREATAS
。但是要使用TREATAS
,我们必须引用Premium
和Losses
表中的列名,因此我们不能使用VAR
来声明它们,而必须实例化他们。最后,解决方案是:
Premium
和Losses
创建计算表。使用TREATAS
模仿数据沿袭,并将Premium
表与Losses_TreatAs
联接。
MyTable =
VAR Losses_TreatAs = TREATAS(Losses, Premium[PolicyNumber], Losses[Losses])
RETURN NATURALLEFTOUTERJOIN(Premium, Losses_TreatAs)
结果:
答案 1 :(得分:0)