Oracle; Einträge zählen

binfgi

Mitglied
Hallo zusammen,

ich habe folgendes Problem:
Es gibt eine Tabelle Orders mit den Spalten id_order (PK), id_method(FK) und date.
Desweiteren gibt es die Tabelle Methods mit den Spalten id_method (PK) und description

Jetzt hätte ich gerne eine Ausgabe, welche mir alle Methoden ausgibt und dahinter die Anzahl der Orders mit der besagten Methode, allerdings nur für das aktuelle Jahr.

Ich habe immer das Problem, dass ich nur die Methoden bekommen, die auch in diesem Jahr bereits eine Order haben und nicht alle Methoden.

Versucht habe es mit dem folgenden Code:
Code:
SELECT id_method, description, count(o.id_orders) n_orders
FROM methods m, orders o, orders o2
WHERE
m.id_method = o2.id_method (+)
o2.id_order = o.id_order (+)
AND to_char(o.date, 'yyyy') = to_char(sysdate, 'yyyy')

Kann mir da jemand helfen?
Vielen Dank und viele Grüße
 
ups, Entschuldigung.
Das hatte ich vergessen mit aufzuschreiben. Die hatte ich natürlich genutzt, sonst funktioniert ja auch gar kein count!

Code:
SELECT id_method, description, count(o.id_orders) n_orders
FROM methods m, orders o, orders o2
WHERE
m.id_method = o2.id_method (+)
o2.id_order = o.id_order (+)
AND to_char(o.date, 'yyyy') = to_char(sysdate, 'yyyy')
GROUP BY
m.id_method
ORDER BY m.id_method
 
Mal so als Frage, warum verwendest du keine normalen JOIN-Statements (macht es meiner Meinung nach übersichtlicher)?

Was ist der Fehler am Ergebnis? Ohne einen Hinweis darauf wird es etwas schwierig :)
 
steht oben in der ersten Beschreibung drin ;-)
Ich bekomme nicht alle Methoden angezeigt, sondern nur diejenigen, welche eine Order in diesem Jahr haben.
 
Ich hab jettz keine Oracle-Doku hier, aber ich weiß, dass man in Oracle bei Ergebnissen sagen kann, dass wenn kein Ergebnis vorliegt, NULL oder 0 oder so angezeigt werden soll. Da müsstest du mal nach suchen :/ Oracle ist bei mir schon ca. 3 Jahre her
 
auch wenn's vielleicht zu spät kommt, wollte ich noch ergänzen, dass das wie ein Fall für eine <scalar subquery> in der SELECT-Liste klingt, also etwas wie:

SQL:
select tablespace_name, 
       (select count(*) 
          from dba_data_files f
         where f.tablespace_name = t.tablespace_name) file_count 
  from dba_tablespaces t;

Das Verfahren sorgt dafür, dass alle Werte der Haupt-Query erscheinen, und solche ohne Entsprechung in der Subquery einen count(*) = 0 erhalten (weil die Korrelation kein Ergebnis liefert).

Gruß

MP
 
Zuletzt bearbeitet von einem Moderator:
Die Subquery-Variante bietet sich an, wobei ich es uebersichtlicher finde, wenn man mit Subquery Factoring arbeitet (WITH-Klausel). Geht aber auch mit einem Left Outer Join:

SQL:
-- die Oracle-Variante
SELECT dts.tablespace_name, count(ddf.file_id) 
FROM dba_tablespaces dts, dba_data_files ddf
WHERE dts.tablespace_name = ddf.tablespace_name (+)
GROUP BY dts.tablespace_name;

-- fuer die Puristen: ANSI =)
SELECT dts.tablespace_name, count(ddf.file_id) 
FROM dba_tablespaces dts LEFT OUTER JOIN dba_data_files ddf
ON dts.tablespace_name = ddf.tablespace_name
GROUP BY dts.tablespace_name;
 
Hallo,

also ich habe das Problem in der Zwischenzeit mit einem Subselect gelöst.
Mit einem einfachen outer join funktioniert es aufgrund der Datumseinschränkung nicht. Das war natürlich mein erster Versuch gewesen.

Aber trotzdem allen vielen Dank!
 

Neue Beiträge

Zurück