Bu Tam Dış Birleştirme neden çalışmıyor?


10

İstediğim sonuçları elde etmek için daha önce Full Outer Joins'i kullandım, ama belki de konsepti tam olarak anlamıyorum çünkü basit bir birleşimin ne olacağını başaramıyorum.

Her biri 2 alanlı 2 tablo (ki ben t1 ve t2 diyeceğim) var:

t1

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

t2

Policy_Number   Loss
101              5
103              9
107              20

Ne yapmaya çalışıyorum, hem tablolardan hem de Policy_Number prim ve kayıp toplamı elde etmektir. Ben kullanıyorum kodu:

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

Yukarıdaki kod doğru toplamları döndürür ancak "NULL" ilke_sayısı altında ilke_sayısı eşleşmesinin olmadığı tüm kayıtları gruplandırır.

Sonucumun böyle görünmesini istiyorum

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

vb.....

Aşağıda gösterildiği gibi bir NULL ilke numarası gösteren bir sonuç istemiyorum (NULL ilke_numarası gibi bir şey olmadığı için. Bu sadece her iki tablodaki ilke_numarası eşleşmediğinde toplamdır)

Policy_Number    Prem_Sum   Loss_Sum
   NULL            35         NULL

Eğer t1.policy_number yerine t2.policy_number ile seçip gruplandırırsam, aşağıdaki gibi bir kayıt alırım.

Policy_Number    Prem_Sum   Loss_Sum
   NULL            NULL         20

Yine, Prem_Sum altında veya Loss_sum altında NULL görmeyi umursamıyorum ama Policy_Number altında NULL istemiyorum. Sonuçlarımın şöyle bir şey olmasını isterim

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

vb .....

Tam dış birleşimin bunu başaracağını düşündüm ama sanırım bir şey eksik. Belki de seçebilir ve alt sorgu olarak t1.policy_number ve t2.policy_number tarafından grup ve sonra belki dış sorguda bir şey veya bir şey yapabilir ??? Bunun bu kadar karmaşık olması gerektiğini düşünmüyorum.

Herhangi bir fikir veya öneriniz var mı?

Yanıtlar:


8

Düzgün bir şekilde gruplayabilmeniz için her iki polis memesinde de isnull yapmalısınız.

Bir dış birleşim olduğu için, birleşimin bir tarafının hala veri varken NULL olma olasılığı vardır.

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)

... bu da null değerlerinin SQL tarafından değerler gibi ele alındığı anlamına gelir, bu yüzden ISNULL () gerekir. Bu yüzden SQL çok kötü ağızlıdır. Yine de her gün kullanıyorum.
Paul-Sebastian Manole

4

Tam dış birleşim, ihtiyacınız olan kayıt yapısını oluşturur, ancak 107 numaralı ilke numarasını sizin için Tablo 1'e koymaz.

Sanırım ihtiyacınız olan şey,

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

Belirli sorgunuzun neden çalışmadığına ilişkin biraz daha fazla bilgi sağlamak için. Başlangıç ​​kodunuz:

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 

İlk bakışta, çalışması gerektiği gibi görünüyor. Ancak, belirtilen üçüncü sütunun t1.policynumber olduğuna dikkat edin. Bu aynı zamanda tek gruplama sütunudur. Bu nedenle SQL Server yalnızca t1'deki değerleri görür ve t1'de olmayan değerleri boş olarak bırakır (çünkü unutmayın, bu tam bir dış birleşimdir). İsnull (t1.policynumber, t2.policynumber) kodu size t1'deki null olmayan tüm değerleri sağlar, sonra t2'deki değerleri kullanır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.