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: 4391
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: 4391
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: 4391
Registriert: Mo 23 Jun, 2003 16:50


Zur√ľck zu MySQL

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast