aggregatsfunktionen: mysql vs. oracle

Der MySQL Datenbank-Server für Internet- und Intranet-Lösungen.

aggregatsfunktionen: mysql vs. oracle

Beitragvon radditz » Sa 01 Okt, 2005 10:58

hi. unter oracle sollte sowas möglich sein:
SELECT MAX(COUNT( * )) FROM TabelleA
Unter MySQL funktioniert das gleiche Kommando nicht.
Ich habe zwar bereits eine Lösung gefunden, dies zu umgehen, aber mich würde generell mal interessieren, ob das ein Special Feature von Oracle is oder ob das nur eben bei MySQL nicht funktioniert.
Telematica DSL Solo Pro 30 Mbit/s
Vorher: A1 VDSL 16 Mbit/s
radditz
Ultimate Power-User
Ultimate Power-User
 
Beiträge: 4399
Registriert: Mo 23 Jun, 2003 16:50

Beitragvon mnc » So 02 Okt, 2005 10:06

COUNT gibt doch die Anzahl der Records zurück oder?
1., Was machts für Sinn das auf * anzuwenden?
2., Was soll das MAX, da Count wohl zu einer Zeit immer nur max einen Wert liefern wird.

Oder ich bin grad völlig falsch abgebogen.

Nachsatz, Oracle Umsteiger auf was "kleineres" steigen lieber auf PostgreSQL um = weniger graue Haare :)
mnc
Board-Mitglied
Board-Mitglied
 
Beiträge: 223
Registriert: Mi 19 Mai, 2004 18:27

Beitragvon radditz » So 02 Okt, 2005 12:32

bin kein umsteiger, eher von mysql auf oracle (machen wir in der schule)

naja, das ganze sieht so aus:
SELECT MAX(COUNT ( * )) FROM Verkäufe GROUP BY ArtikelNr

Ich tu eine Gruppe über die Artikelnr. wenn ich das MAX nicht hätte, würd ich immer herausbekommen, wie oft ein Artikel verkauft wurde (den Artikel selbst krieg ich ja nicht raus, is ja nicht in der Projektion). Jetz will ich einfach wissen, was das Maximum ist. Das funktioniert (laut Professor) unter Oracle.
Die ganze Query sieht so aus:
SELECT ArtikelNr, COUNT(*) as Anzahl FROM Verkäufe GROUP BY ArtikelNr HAVING Anzahl = (SELECT MAX(COUNT(*)) FROM Verkäufe GROUP BY ArtikelNr)
Das Ergebnis wären also die Artikel, die am öftesten verkauft wurden.
HAVING
Telematica DSL Solo Pro 30 Mbit/s
Vorher: A1 VDSL 16 Mbit/s
radditz
Ultimate Power-User
Ultimate Power-User
 
Beiträge: 4399
Registriert: Mo 23 Jun, 2003 16:50

Beitragvon hannibal218bc » Mo 03 Okt, 2005 15:47

Ahoi,

yepp, AFAIK ist das ein Oracle-Spezifikum dass es solche doppelten Aggregatfunktionen kann.

@mnc: count(*) zählt einfach Datensätze, es ist egal welches (oder überhaupt ein) Feld befüllt ist. Ein count(abc) würde nur Datensätze zählen, bei denen abc nicht NULL ist.

Falls mySQL schon Subqueries unterstützt (?), probier mal folgendes:

SELECT MAX(anzahl) FROM
(
SELECT count(*) as anzahl from ... group by ...
)
;

In PostgreSQL zumindest sollte das problemlosest gehen.


HTH & lg,
-hannes
hannibal218bc
Senior Board-Mitglied
Senior Board-Mitglied
 
Beiträge: 382
Registriert: Mi 18 Aug, 2004 21:11
Wohnort: Wien

Beitragvon hannibal218bc » Mo 03 Okt, 2005 15:50

BTW,

eleganter um den meistverkauften Artikel herauszubekommen:

Code: Alles auswählen
SELECT ArtikelNr FROM Verkäufe GROUP BY ArtikelNr ORDER BY count(*) LIMIT 1


bzw. für Oracle musst Du das in eine Subquery verpacken und ROWNUM verwenden:


Code: Alles auswählen
SELECT * FROM (
SELECT ArtikelNr FROM Verkäufe GROUP BY ArtikelNr ORDER BY count(*) )
WHERE ROWNUM<1


(wobei ich mir jetzt nicht sicher bin ob die Rownum bei 0 oder 1 anfängt...)

lg,
-hannes
hannibal218bc
Senior Board-Mitglied
Senior Board-Mitglied
 
Beiträge: 382
Registriert: Mi 18 Aug, 2004 21:11
Wohnort: Wien

Beitragvon radditz » Mo 03 Okt, 2005 15:59

danke, die Lösungen habe ich bereits selbst (bin ja nicht neu in MySQL). Gut zu wissen, dass es Oracle spezifisch ist. Subquerys werden von MySQL natürlich unterstützt.
Telematica DSL Solo Pro 30 Mbit/s
Vorher: A1 VDSL 16 Mbit/s
radditz
Ultimate Power-User
Ultimate Power-User
 
Beiträge: 4399
Registriert: Mo 23 Jun, 2003 16:50


Zurück zu MySQL

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 12 Gäste