it-swarm-eu.dev

Proč nefunguje toto připojení Full Outer?

Už dříve jsem použil Full Outer Joins, abych dosáhl požadovaných výsledků, ale možná ten koncept úplně nerozumím, protože nejsem schopen dosáhnout toho, co by mělo být jednoduché spojení.

Mám 2 tabulky (které nazývám t1 a t2), každá se 2 poli:

t1

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

t2

Policy_Number   Loss
101              5
103              9
107              20

Snažím se získat součet prémií a souhrnu ztrát z obou tabulek a také čísla Policy_Number. Kód, který používám, je:

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

Výše uvedený kód vrátí správné součtové součty, ale seskupí všechny záznamy, u kterých neexistuje číslo policy_number pod hodnotou "NULL" policy_number.

Chtěl bych, aby můj výsledek vypadal takto

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

atd.....

Nechci výsledek, který ukazuje NULL policy_number, jak je ukázáno níže (protože neexistuje nic takového jako NULL policy_number. Toto je pouze celková hodnota za to, že se policy_number z obou tabulek neshoduje):

Policy_Number    Prem_Sum   Loss_Sum
   NULL            35         NULL

Pokud vyberu a seskupím podle t2.policy_number namísto t1.policy_number, dostanu něco jako níže jako záznam.

Policy_Number    Prem_Sum   Loss_Sum
   NULL            NULL         20

Opět mi nevadí vidět NULL pod Prem_Sum nebo Loss_sum, ale nechci NULL pod Policy_Number. Chtěl bych, aby moje výsledky byly něco jako

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

ect .....

Myslel jsem, že to celé vnější spojení dosáhne, ale myslím, že mi něco chybí. Myslel jsem, že bych mohl vybrat a seskupit podle t1.policy_number a t2.policy_number jako vedlejší dotaz a pak možná udělat CASE ve vnějším dotazu nebo tak něco ??? Nemyslím si, že by to mělo být tak komplikované.

Máte nějaké nápady nebo rady?

10
Juan Velez

Měli byste udělat isnull pro obě čísla zásad, abyste se mohli správně seskupit.

Protože se jedná o vnější spojení, existuje možnost, že jedna strana spojení bude NULL, zatímco budou mít stále data.

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)
8
Derek Kromm

Úplné vnější spojení vytvoří strukturu záznamu, kterou potřebujete, ale nepřidá do tabulky 1 číslo zásady 107.

Myslím, že to, co potřebujete, je něco podobného

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)
4
Hellion

Chcete-li poskytnout trochu více informací o tom, proč váš konkrétní dotaz nefungoval. Váš počáteční kód byl:

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 

Na první pohled to vypadá, že by to mělo fungovat. Všimněte si však, že zadaný třetí sloupec je t1.policynumber. Toto je také jediný sloupec seskupování. Z tohoto důvodu SQL Server vidí pouze hodnoty v t1 a ponechává všechny hodnoty, které nejsou v t1, jako null (protože pamatujte, jedná se o úplné vnější spojení). Kód isnull (t1.policynumber, t2.policynumber) vám poskytne všechny null hodnoty v t1 a poté použije hodnoty v t2.

2
DForck42