এই সম্পূর্ণ আউটার কেন কাজ করছে না?


10

আমি আমার কাঙ্ক্ষিত ফলাফল পাওয়ার জন্য ফুল আউটারের সাথে যোগদানের আগে ব্যবহার করেছি, তবে সম্ভবত আমি ধারণাটি পুরোপুরি বুঝতে পারি না কারণ একটি সহজ যোগদানের কী হওয়া উচিত তা আমি সম্পাদন করতে সক্ষম নই।

আমার 2 টি সারণী রয়েছে (যা আমি টি 1 এবং টি 2 কল করব) প্রতি 2 টি ক্ষেত্র সহ:

T1

Policy_Number Premium
101             15
102              7
103             10
108             25
111              3

T2

Policy_Number   Loss
101              5
103              9
107              20

আমি যা করার চেষ্টা করছি তা হ'ল উভয় টেবিল থেকে প্রিমিয়াম এবং ক্ষতির সমষ্টি এবং পলিসি_ নাম্বার। আমি যে কোডটি ব্যবহার করছি তা হ'ল:

select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, t1.policynumber
from t1 full outer join t2 on t1.policynumber = t2.policynumber
group by t1.policynumber

উপরের কোডটি সঠিক যোগফলগুলি ফেরত দেবে তবে এটি "ন্যূনুয়াল" নীতি_নামারের অধীনে পলিসি_ সংখ্যার মিল নেই সেখানে সমস্ত রেকর্ডকে গ্রুপ করবে।

আমি আমার ফলাফলটি দেখতে চাই

Policy_Number    Prem_Sum    Loss_Sum
    107            NULL        20
    111              3        NULL
    101             15          5

ইত্যাদি .....

আমি এমন কোনও ফলাফল চাই না যা নীচের মতো একটি নীতি নীতি_সংখ্যা দেখায় (যেহেতু কোনও নল পলিসি_নম্বরের মতো কিছুই নেই both উভয় টেবিলের পলিসি_সংখ্যার সাথে মেলে না তখন এটি মোট):

Policy_Number    Prem_Sum   Loss_Sum
   NULL            35         NULL

আমি যদি সিলেক্ট হয়ে t1.policy_number এর পরিবর্তে t2.policy_number দ্বারা গ্রুপ করি তবে রেকর্ড হিসাবে নীচের মতো কিছু পাই।

Policy_Number    Prem_Sum   Loss_Sum
   NULL            NULL         20

আবার, আমি ভালবাসা_সামের অধীনে বা লস_সুমের অধীনে নুল দেখতে কোনও আপত্তি করি না তবে আমি নীতি_নামারের অধীনে কোনও নুল চাই না। আমি চাই আমার ফলাফলগুলি এমন কিছু হোক

Policy_Number    Prem_Sum    Loss_Sum
    107            NULL        20
    111              3        NULL
    101             15          5

ect, .....

আমি ভেবেছিলাম সম্পূর্ণ বাইরের যোগদানটি এটি সম্পাদন করবে তবে আমি অনুমান করি যে আমি কিছু অনুপস্থিত। আমি ভাবছিলাম সম্ভবত আমি সাব কোয়েরি হিসাবে t1.policy_number এবং t2.policy_number উভয় দ্বারা নির্বাচন করে গ্রুপ করতে পারি এবং তারপরে সম্ভবত বাইরের ক্যোয়ারিতে একটি সিএসই বা কিছু করতে পারি ??? আমার মনে হয় না এটি জটিল হওয়া উচিত।

কোন ধারণা বা পরামর্শ?

উত্তর:


8

উভয় পলিসি নাম্বারে আপনার একটি করা উচিত যাতে আপনি সঠিকভাবে গ্রুপ করতে পারেন।

যেহেতু এটি একটি বহিরাগত-যোগদানের, তাই ডেটা থাকার সময় যোগদানের এক পক্ষের NULL হওয়ার সম্ভাবনা রয়েছে।

select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, isnull(t1.policynumber, t2.policynumber)
from t1 full outer join t2 on t1.policynumber = t2.policynumber
group by isnull(t1.policynumber, t2.policynumber)

... যার অর্থ হল যে নালগুলি এসকিউএল দ্বারা মানগুলির মতো বিবেচনা করা হয় যার জন্য আপনার প্রয়োজন হয় ISNULL ()। এজন্য এসকিউএল এত খারাপ মুখর। তবুও আমি এখনও এটি প্রতিদিন ব্যবহার করি।
পল-সেবাস্তিয়ান মানোলে

4

সম্পূর্ণ বাহ্যিক যোগদানটি আপনার প্রয়োজনীয় রেকর্ড কাঠামো তৈরি করবে তবে এটি নীতিমালা 107 আপনার সারণী 1 এ রাখবে না।

আমার মনে হয় আপনার যা দরকার তা হ'ল লাইনের সাথে কিছু

select coalesce(t1.policy_number, t2.policy_number) as PolicyNumber, 
sum(t1.premium) as PremSum, sum(t2.loss) as LossSum
from t1 full outer join t2 on t1.policy_number = t2.policy_number
group by coalesce(t1.policy_number, t2.policy_number)

2

আপনার নির্দিষ্ট কোয়েরিটি কেন কাজ করে না সে সম্পর্কে আরও কিছু তথ্য সরবরাহ করতে। আপনার প্রারম্ভিক কোডটি ছিল:

select sum(premium) Prem_Sum, sum(Loss) Loss_Sum, t1.policynumber 
from t1 full outer join t2 on t1.policynumber = t2.policynumber 
group by t1.policynumber 

প্রথম নজরে, দেখে মনে হচ্ছে এটি কাজ করা উচিত। তবে লক্ষ্য করুন যে নির্দিষ্ট করা তৃতীয় কলামটি টি 1.পলিসনিম্বার। এটি একক গ্রুপিং কলামও। এই এসকিউএল সার্ভারের কারণে কেবল টি 1-তে মানগুলি পড়ে থাকে, কোনও মানকে টি 1-এ বাতিল করে না রেখে (কারণ মনে রাখবেন, এটি একটি সম্পূর্ণ বাহ্যিক যোগদান)। ইসনুল (t1.policynumber, t2.policenumber) কোড আপনাকে টি 1-এ সমস্ত নন-নাল মান প্রদান করবে, তারপরে টি 2-তে মানগুলি ব্যবহার করবে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.