請求書とクレジットカード取引の間に多対多の関係があり、それらの合計を一緒にマッピングしようとしています。問題を考える最良の方法は、TransactionInvoiceMap を 2 部グラフとして想像することです。接続された各サブグラフについて、そのサブグラフ内のすべての請求書の合計とすべてのトランザクションの合計を見つけます。私のクエリでは、これらのサブグラフごとに計算された値と、関連付けられているトランザクション ID を返したいと考えています。関連するトランザクションの合計は同じである必要があります。
より明確に、次のトランザクション/請求書を考えると
Table: TransactionInvoiceMap
TransactionID InvoiceID
1 1
2 2
3 2
3 3
Table: Transactions
TransactionID Amount
1 $100
2 $75
3 $75
Table: Invoices
InvoiceID Amount
1 $100
2 $100
3 $50
私の望む出力は
TransactionID TotalAsscTransactions TotalAsscInvoiced
1 $100 $100
2 $150 $150
3 $150 $150
請求書 2 と 3、およびトランザクション 2 と 3 は論理グループの一部であることに注意してください。
これは明らかに機能するが非常に遅い解決策(簡略化され、名前が変更された)です。これを最適化する方法を理解するのに苦労していますが、TransactionInvoiceGrouping へのサブクエリを削除する必要があると思います。根本的に異なる何かを自由に提案してください。
with TransactionInvoiceGrouping as (
select
-- Need an identifier for each logical group of transactions/invoices, use
-- one of the transaction ids for this.
m.TransactionID,
m.InvoiceID,
min(m.TransactionID) over (partition by m.InvoiceID) as GroupingID
from TransactionInvoiceMap m
)
select distinct
g.TransactionID,
istat.InvoiceSum as TotalAsscInvoiced,
tstat.TransactionSum as TotalAsscTransactions
from TransactionInvoiceGrouping g
cross apply (
select sum(ii.Amount) as InvoiceSum
from (select distinct InvoiceID, GroupingID from TransactionInvoiceGrouping) ig
inner join Invoices ii on ig.InvoiceID = ii.InvoiceID
where ig.GroupingID = g.GroupingID
) as istat
cross apply (
select sum(it.Amount) as TransactionSum
from (select distinct TransactionID, GroupingID from TransactionInvoiceGrouping) ig
left join Transactions it on ig.TransactionID = it.TransactionID
where ig.GroupingID = g.GroupingID
having sum(it.Amount) > 0
) as tstat