我可以在不同字段的数据仓库/表格模型中创建多对多关系吗?

Can I create a many-to-many relationship in my data warehouse / tabular model on different fields?

想象一下以下情况:

我正在为一家经纪公司设计数据仓库/表格 cube/model。 这意味着当经纪人创建合约时,有一个买方和一个卖方。

所以当我创建 Fact_Contracts 时,它看起来像这样:

CREATE TABLE [dbo].[Fact_Contracts](
    [FactContractId] [INT] IDENTITY(1,1) NOT NULL,
    [ContractBuyer_Client_Key] [INT] NOT NULL,
    [ContractSeller_Client_Key] [INT] NOT NULL,
    [ContractDate_Key] [INT] NOT NULL,
    [ContractAmount] [DECIMAL](18, 2) NOT NULL,
)

现在我有我的客户维度:

CREATE TABLE [dbo].[Dim_Clients](
    [ClientKey] [int] IDENTITY(1,1) NOT NULL,
    [ClientBK] [int] NOT NULL,
    [ClientName] [nvarchar](20) NOT NULL,
)

假设我有 1 个合同,其中 ContractBuyer_Client_Key = 1 和 ContractSeller_Client_Key = 2 并且 ContractAmount = 1000。

现在,当我查看我的表格多维数据集时,我想创建一个报告,显示有关我的客户和我的 ContractAmount 的详细信息。输出应该是这样的:

FactContractId  Client_Key   ClientName   ContractAmount
10              1            Abraham      1000
10              2            Björk        1000
--------------------------------------------------------
Total                                     1000
--------------------------------------------------------

是否可以创建这样的互惠报告,其中我结合了 Fact-table 中的两个不同列?

请注意:将总计除以 2 的解决方案不是一个选项。还有其他问题导致此操作无法执行:有时我有第三方作为合同的一部分,但我的 table 的这个简单大纲中并未显示。所以我的总数需要是所有唯一合同的总和。

这是你的事实table

select * from contract;

  BUYER_ID  SELLER_ID     AMOUNT
---------- ---------- ----------
         1          2       1000

在其顶部创建一个角色视图

create view contract_role as         
select 'Buyer' role_id, BUYER_ID client_id, amount from contract
union all
select 'Seller' role_id, SELLER_ID client_id, amount from contract;

select * from contract_role;

ROLE_I  CLIENT_ID     AMOUNT
------ ---------- ----------
Buyer           1       1000
Seller          2       1000

现在您可以报告所有 角色,但考虑 总数 仅来自 角色[=23] =]

select CLIENT_ID, AMOUNT,
sum(case when ROLE_ID = 'Buyer' then AMOUNT end) over ( ) as total_amount
from contract_role

 CLIENT_ID     AMOUNT TOTAL_AMOUNT
---------- ---------- ------------
         1       1000         1000
         2       1000         1000

Marmite Bomber 确实让我找到了正确的方向,但答案并非 100% 正确。

如前所述创建 contract_role 视图是正确的。但是我不是仅仅从一个角色添加数据,而是在 dax 中使用 SUMMARIZE:

SumOfAmount := 
CALCULATE(
     SUM(Fact_Contracts[ContractAmount]),
     SUMMARIZE(
         contract_role,
         Fact_Contract[FactContractId]
    )
)

即使我的角色不仅仅是买方和卖方,这似乎也有效。