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?
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)
Ú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)
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.