【问题标题】:Can I create a many-to-many relationship in my data warehouse / tabular model on different fields?我可以在我的数据仓库/表格模型中的不同字段上创建多对多关系吗?
【发布时间】:2021-03-05 13:26:06
【问题描述】:

想象以下情况:

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

所以当我创建我的 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
--------------------------------------------------------

是否可以创建这样的互惠报告,其中我将我的事实表中的两个不同列组合在一起?

请注意:我无法将总计除以 2 的解决方案。还有其他一些问题使这种情况无法实现:有时我有第三方作为合同的一部分,而我的表格的这个简单的大纲中没有显示出来。所以我的总数需要是所有独特合同的总和。

【问题讨论】:

    标签: many-to-many data-warehouse tabular ssas-tabular


    【解决方案1】:

    这是你的事实表

    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
    

    现在您可以报告所有角色,但只考虑其中一个角色

    总数
    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 轰炸机,谢谢!你把我引向了正确的方向。根据我的问题,您的答案是 100% 正确的。在我的真实示例中,我实际上可以在 Buyer 中有 NULL 值(我的错是我没有在我的虚构示例中正确显示它!)。卖家也可以为 NULL(是的,我可以有买家委托人或卖家委托人......)。所以我在下面创建的答案给了我正确的值。
    【解决方案2】:

    Marmite Bomber 确实让我朝着正确的方向前进,但答案并非 100% 正确。

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-19
      • 2014-05-06
      • 2020-10-16
      • 2019-08-17
      • 2019-05-18
      相关资源
      最近更新 更多