Oracle 10g - Jahreszahlen ausgeben

Hey,
sorry, mir ist kein sinniger Titel eingefallen, deswegen hat mir Google schon nicht weiter helfen können :wink:

Ich vereinfache mal mein Problem, ich habe 2 Tabellen:

table1: id, jahr, wert
table2: id, land

Ich hätte gern die gezählten Werte, gruppiert nach Jahr und Land, sieht dann so aus:

select t1.jahr, t2.land, count(t1.wert) as sum
from table1 t1
join table2 t2
on t1.id = t2.id
where t1.jahr between 1995 and 2005
and t2.land in (‚DE‘, ‚US‘, ‚JP‘)
group by t1.jahr, t2.land;

Existieren keine Matches zu einem Jahr, werden diese in meinem Resultset nicht angezeigt, die sehen dann z.B. so aus:

1995 DE 5
1997 DE 3
1998 DE 2
.
.
.

Ich hätte aber gern, dass mir alle Jahre angezeigt werden (also zwischen 1995 und 2005) und eben eine 0 bei sum, wo keine Werte vorhanden sind.
Nun dachte ich, mach ich das einfach mit einem left join, die Abfrage wäre dann so:

select t1.jahr, t2.land, count(t1.wert) as sum
from table1 t1
left join table2 t2
on t1.id = t2.id
where t1.jahr between 1995 and 2005
and t2.land in (‚DE‘, ‚US‘, ‚JP‘)
group by t1.jahr, t2.land;

Nur wird mir leider genau das gleiche angezeigt.
Ich schätze, ich habe irgendwo einen ziemlich dummen Denkfehler, komme aber nicht drauf, was es ist. Achso, in t1 sind auf jeden Fall alle Jahreszahlen drin, nur eben nicht unter den Bedingungen, die die Abfrage braucht.

Kann mir jemand nen Tipp geben?

Danke :smile:

lg Nadine

Hi!

select t1.jahr, t2.land, count(t1.wert) as sum
from table1 t1
left join table2 t2
on t1.id = t2.id
where t1.jahr between 1995 and 2005
and t2.land in (‚DE‘, ‚US‘, ‚JP‘)
group by t1.jahr, t2.land;

Achso, in t1
sind auf jeden Fall alle Jahreszahlen drin, nur eben nicht
unter den Bedingungen, die die Abfrage braucht.

Outer Join.

Da ich dem gejoine nix abgewinnen kann, die „alte“ Oracle-Kurzschreibweise:

select t1.jahr, t2.land, count(t1.wert) sum
 from table1 t1
 ,table2 t2
 where t1.id = t2.id (+)
 and t1.jahr between 1995 and 2005
 and t2.land(+) in ('DE', 'US', 'JP')
 group by t1.jahr, t2.land;

(nicht getestet, ev. hab ich was falsch verstanden)

(+) -> Outer Join der zugehörigen Tabelle zu dem/n Feld(ern)

Grüße,
Tomh

Hallo Nadine

so umformuliert sollte dein Statement funktionieren (ungetestet):

select t1.jahr, t2.land, count(t1.wert) as sum

from table1 t1
left join table2 t2

on t1.id = t2.id
and t2.land in (‚DE‘, ‚US‘, ‚JP‘)

where t1.jahr between 1995 and 2005

group by t1.jahr, t2.land;

Gruss,
SomeOne

*seufz* danke für eure Tipps, aber beides hat nicht funktioniert… oracle konnte mit einem meiner outer joins nicht umgehen…

Moin moin,
hier mal mein Lösungsansatz(getestet):

 select \* from werte order by jahr;

 ID JAHR WERT
---------- ---------- ----------
 4 1994 1
 1 1995 1
 1 1996 1
 1 1997 1
 5 1998 1
 3 1999 1
 1 1999 1
 2 1999 1
 4 2000 1

SQL\> select \* from land;

 ID LAND
---------- ----
 1 DE
 2 US
 3 JP
 4 FR
 5 GB


 select t1.jahr,
 (select count(\*) from land t2 , werte t3
 where t2.id = t3.id
 and land in ('DE','JP','US')
 and t3.jahr = t1.jahr ) anzahl
 from werte t1
 group by jahr
 order by jahr; 

Ergebnis: 
 JAHR ANZAHL
---------- ----------
 1994 0
 1995 1
 1996 1
 1997 1
 1998 0
 1999 3
 2000 0

Jetzt noch das Jahr einbauen und fertig…
Wichtig ist, dass es in der WERTE-Tabelle auch wirklich jedes Jahr gibt, ansonsten geht deswegen eins verloren.