Group By in Join

gurbelunder

SQL-Guru
Beiträge
136
Hi zusammen,

heute habe ich mal wieder einen Hänger und die Brille ist gerade irgendwie nicht gut genug geputzt.

Unter Oracle habe ich eine Tabelle, in der einmal in der Woche die aktuelle Größe aller Tablespaces eingetragen wird. Hierauf möchte ich eine Wachstumsübersicht generieren und habe dafür den folgenden SELECT geschrieben:

Code:
select a.tablespace_name, a.usedsizemb "old size", b.usedsizemb "new size", a.maxsizemb, round(sum(b.usedsizemb) - sum(a.usedsizemb)) "Growth in MB"
from 
( select tablespace_name, usedsizemb, maxsizemb
  from tbs_growth
  where TO_CHAR(updated_at, 'DD.MM.RRRR') = TO_CHAR(sysdate, 'DD.MM.RRRR')) a,
( select tablespace_name, usedsizemb, maxsizemb
  from tbs_growth
  where TO_CHAR(updated_at, 'DD.MM.RRRR') = TO_CHAR(sysdate+7, 'DD.MM.RRRR')) b,
( select distinct tablespace_name
  from tbs_growth) c
where a.tablespace_name = b.tablespace_name
group by a.tablespace_name
order by a.tablespace_name;

Allerdings ist der Fehler, der mir zurückgeworfen wird, dieser:

Code:
ORA-00979: Kein GROUP BY-Ausdruck
00979. 00000 -  "not a GROUP BY expression"
*Cause:    
*Action:
Fehler in Zeile: 1 Spalte: 27

Die GROUP BY Klausel brauche ich hier aber definitiv, da ich ja ein SUM mache. Lasse ich den Alias "a" weg, kann er, logischerweise, das Feld "tablespace_name" nicht finden.

Ich bin gerade irgendwie betriebsblind und find's nicht. Könnt ihr mal was sehen?

Danke euch und Gruß,
David
 
Werbung:

gurbelunder

SQL-Guru
Beiträge
136
Nach "a.maxesizemb" zu gruppieren wäre hier strafbar, das ist eigentlich nur eine Angabe für eine schicke Ausgabe, wäre aber eigentlich gar nicht notwendig. Hauptsächlich geht es hier um "a.usedsizemb", "b.usedsizemb" und deren Differenz. Ich habe daher vorerst "a.maxsizemb" rausgeschmissen.

Als ich ihm dann aber die beiden Felder "a.usedsizemb" und "b.usedsizemb" im GROUP BY gegeben habe, hat's wunderbar geklappt.

Code:
select a.tablespace_name, a.usedsizemb "old size", b.usedsizemb "new size", round(sum(b.usedsizemb) - sum(a.usedsizemb)) "Growth in MB"
from 
( select tablespace_name, usedsizemb
  from tbs_growth
  where TO_CHAR(updated_at, 'DD.MM.RRRR') = TO_CHAR(sysdate, 'DD.MM.RRRR')) a,
( select tablespace_name, usedsizemb
  from tbs_growth
  where TO_CHAR(updated_at, 'DD.MM.RRRR') = TO_CHAR(sysdate+7, 'DD.MM.RRRR')) b,
( select distinct tablespace_name
  from tbs_growth) c
where a.tablespace_name = b.tablespace_name
group by a.tablespace_name, a.usedsizemb, b.usedsizemb
order by a.tablespace_name;

So richtig Sinn ergibt's mir gerade nur nicht.

Kurz mal zu "a.maxsizemb": Hier hinter steckt die maximale Größe eines Tablespaces unter Oracle, die an die maximale Größe eines Datenfiles gebunden ist. Ist also Oracle spezifisch in diesem Fall ;)
 

akretschmer

Datenbank-Guru
Beiträge
9.731
Nach "a.maxesizemb" zu gruppieren wäre hier strafbar, das ist eigentlich nur eine Angabe für eine schicke Ausgabe, wäre aber eigentlich gar nicht notwendig. Hauptsächlich geht es hier um "a.usedsizemb", "b.usedsizemb" und deren Differenz. Ich habe daher vorerst "a.maxsizemb" rausgeschmissen.

Als ich ihm dann aber die beiden Felder "a.usedsizemb" und "b.usedsizemb" im GROUP BY gegeben habe, hat's wunderbar geklappt.

Ja, ist halt so, wie ich es sagte. Du kannst natürlich MySQL nehmen, daß scheißt kräftig auf die SQL-Spec.

Mach halt erst die Aggregation und joine an das Resultat dann dran, was noch so brauchst...
 
Werbung:
Oben