我可以在不同字段的数据仓库/表格模型中创建多对多关系吗?
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]
)
)
即使我的角色不仅仅是买方和卖方,这似乎也有效。
想象一下以下情况:
我正在为一家经纪公司设计数据仓库/表格 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]
)
)
即使我的角色不仅仅是买方和卖方,这似乎也有效。