मेरे पास चालान और क्रेडिट कार्ड लेन-देन के बीच कई से अधिक रिश्ते हैं, जिन्हें मैं एक साथ रकम मैप करने की कोशिश कर रहा हूं। समस्या के बारे में सोचने का सबसे अच्छा तरीका एक द्विपक्षीय ग्राफ के रूप में TransactionInvoiceMap कल्पना करना है। प्रत्येक जुड़े सबग्राफ के लिए, सभी चालानों के कुल और उस सबग्राफ के सभी लेनदेन के कुल खोजें। मेरी पूछताछ में, मैं इनमें से प्रत्येक उप-अनुच्छेद के साथ गणना किए गए मानों को वापस लेनदेन आईडी के साथ वापस करना चाहता हूं। संबंधित लेनदेन के लिए कुल समान होना चाहिए।मैं कई से कई मैपिंग टेबल में डेटा के लॉजिकल सबसेट को कुशलता से कैसे बना सकता हूं?
अधिक स्पष्ट रूप से, निम्नलिखित लेनदेन दिया/चालान
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 एक तार्किक समूह का हिस्सा हैं है।
यहां एक समाधान (सरलीकृत, नाम बदल गया) है जो स्पष्ट रूप से काम करता है, लेकिन बहुत धीमा है। मुझे यह समझने में कठिनाई हो रही है कि इसे कैसे अनुकूलित किया जाए, लेकिन मुझे लगता है कि इसमें ट्रांज़ेक्शनइनोइस ग्रुपिंग में सबक्वायरी को समाप्त करना शामिल होगा। कुछ मूल रूप से अलग सुझाव देने के लिए स्वतंत्र महसूस करें।
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
वे समूहबद्ध हैं क्योंकि वे सभी एक-दूसरे को "स्पर्श" करते हैं। यदि आपने प्रत्येक संबंध के लिए रेखाएं खींची हैं, तो चार ऑब्जेक्ट्स को कवर करने वाला ग्राफ होगा। मैंने सोचा कि इस तरह के समूह के लिए एक मैथी नाम था, लेकिन मुझे याद नहीं है। –
@ स्टुअर्टब्रानन - तो, उन्हें समूहीकृत किया गया है क्योंकि उनके पास एक आम चालान है ?, यह है कि यह कैसे काम करता है? और केवल यही कारण है कि आप कुल लेनदेन राशि के रूप में $ 150 जोड़ रहे हैं, क्योंकि आप लेनदेन 2 और लेनदेन 3 से राशि जोड़ रहे हैं? – Lamak
हां, या यदि कोई आम लेनदेन है। ग्राफ रूपक इसे समझाने के लिए सबसे अच्छा काम करता है। क्या आपने पिछली टिप्पणी लिखी थी जिसे मैंने जवाब दिया था? शायद टिप्पणियां रखने के लिए एक अच्छा विचार है ताकि वे बाद के पाठकों के लिए समझ में आ जाए। –