Announcement

Collapse
No announcement yet.

MAX Funktion funktioniert nicht mit Unterabfrage (Oracle)

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • MAX Funktion funktioniert nicht mit Unterabfrage (Oracle)

    Hallo, versuche normalerweise immer alles erst zu lesen und meine Fehler selbst zu finden, aber diesmal komme ich irgendwie nicht weiter, daher jetzt auch mein erste Eintrag hier

    Es geht um folgende Abfrage:

    SELECT B.ID, B.KundeName, B.GeschaeftsTyp, MAX(B.Gesamtumsatz) AS Gesamtumsatz FROM(
    SELECT
    FK.ID,
    DR.KundeName,
    DR.GeschaeftsTyp,
    SUM(FK.SalesAmount) AS Gesamtumsatz
    FROM
    FaktenKunden FK,
    VerkaufsRegion VR,
    DimReseller DR
    WHERE
    FK.Region = VR.Region AND
    FK.ID = DR.ID AND
    VR.SalesTerritoryGroup = 'ALL' AND
    FK.OrderDateKey >= '2010' AND
    FK.OrderDateKey <= '2011'
    GROUP BY
    FK.ID, DR.KundeName, DR.GeschaeftsTyp
    ORDER BY
    Gesamtumsatz DESC
    ) B
    WHERE
    B.Gesamtumsatz = Gesamtumsatz
    GROUP BY
    ID, KundeName, GeschaeftsTyp
    ORDER BY
    Gesamtumsatz DESC, ID ASC;

    Als Ergebnis werden IMMER mehere Datensätze ausgegeben obwohl ich mehrmals in der Überabfrage angegeben habe das ich nur einen möchte, erstens mit MAX() und zweitens mit WHERE. Außerdem scheint die MAX() funktion überhaupt nicht zu funktionieren, er sortiert nur wegen ORDER BY in beiden Abfragen. Dabei sollte die Abfrage nur den einen Datensatz mit dem höchsten Gesamtumsatz ausgeben (oder halt mehrer wenn die Kunden den gleichen haben).
    Wenn jemand weiter weiß wo ich den Fehler gemacht hat bitte sagen Sitze schon seit mehreren Stunden dran und bin fertig mit den Nerven^^

    Danke schonmal,
    Iggy

  • #2
    Ich würde da noch eine Stufe zwischenschalten. Also so in der Art:
    [highlight=SQL]
    SELECT B.ID, B.KundeName, B.GeschaeftsTyp, C.Gesamtumsatz FROM(
    SELECT (MAX(B.Gesamtumsatz) AS Gesamtumsatz FROM(
    SELECT
    FK.ID,
    DR.KundeName,
    DR.GeschaeftsTyp,
    SUM(FK.SalesAmount) AS Gesamtumsatz
    FROM
    FaktenKunden FK,
    VerkaufsRegion VR,
    DimReseller DR
    WHERE
    FK.Region = VR.Region AND
    FK.ID = DR.ID AND
    VR.SalesTerritoryGroup = 'ALL' AND
    FK.OrderDateKey >= '2010' AND
    FK.OrderDateKey <= '2011'
    GROUP BY
    FK.ID, DR.KundeName, DR.GeschaeftsTyp
    ORDER BY
    Gesamtumsatz DESC
    ) B) C
    WHERE
    B.Gesamtumsatz = C.Gesamtumsatz
    GROUP BY
    ID, KundeName, GeschaeftsTyp
    ORDER BY
    Gesamtumsatz DESC, ID ASC;
    [/highlight]

    Ich hab das aber nun nicht getestet. Aber so in der Art würde ich das machen.

    Comment


    • #3
      Wenn ich das so implementiere wie du das gesagt hast, bekomme ich ein "ORA-00904: "B"."GeschaeftsTyp": invalid identifier ". Ich denke weil Oracle beim ersten SELECT nur auf die direkt Unterabfrage zugreifen kann und da sind die anderen drei ja nicht mit aufgelistet. Also müsste ich alle vier entitys wieder auflisten was mich zum Ausgangsproblem zurückbringt

      Habe jetzt etwas weitergeforscht und gelesen das man eine Laufendenummer miteinbauen könnte (in die unterste Abfrage), und dann WHERE c.laufendenummer = 1. Habe die implementierung mit Oracle aber noch nicht hinbekommen... ahhhh

      aber danke schonmal für die Antwort!

      Comment


      • #4
        Ich habe das Problem vorrübergehend mit "WHERE rownum < 2" gelöst. Aber eigentlich wollte ich im Falle das zwei Kunden einen MAX(Umsatz) haben der gleich ist, das beide ausgegeben werden

        naja..

        Comment


        • #5
          Dann mach das SELECT in den WHERE-clause:

          [highlight=SQL]
          SELECT B.ID, B.KundeName, B.GeschaeftsTyp, B.Gesamtumsatz FROM(
          SELECT
          FK.ID,
          DR.KundeName,
          DR.GeschaeftsTyp,
          SUM(FK.SalesAmount) AS Gesamtumsatz
          FROM
          FaktenKunden FK,
          VerkaufsRegion VR,
          DimReseller DR
          WHERE
          FK.Region = VR.Region AND
          FK.ID = DR.ID AND
          VR.SalesTerritoryGroup = 'ALL' AND
          FK.OrderDateKey >= '2010' AND
          FK.OrderDateKey <= '2011'
          GROUP BY
          FK.ID, DR.KundeName, DR.GeschaeftsTyp
          ORDER BY
          Gesamtumsatz DESC
          ) B
          WHERE
          B.Gesamtumsatz IN (SELECT MAX(Gesamtumsatz) AS Gesamtumsatz FROM(
          SELECT
          FK.ID,
          DR.KundeName,
          DR.GeschaeftsTyp,
          SUM(FK.SalesAmount) AS Gesamtumsatz
          FROM
          FaktenKunden FK,
          VerkaufsRegion VR,
          DimReseller DR
          WHERE
          FK.Region = VR.Region AND
          FK.ID = DR.ID AND
          VR.SalesTerritoryGroup = 'ALL' AND
          FK.OrderDateKey >= '2010' AND
          FK.OrderDateKey <= '2011'
          GROUP BY
          FK.ID, DR.KundeName, DR.GeschaeftsTyp
          ORDER BY
          Gesamtumsatz DESC
          ))
          GROUP BY
          ID, KundeName, GeschaeftsTyp
          ORDER BY
          Gesamtumsatz DESC, ID ASC;
          [/highlight]

          Bisschen umständlich, weil es wieder ne zusätzliche Unterabfrage gibt. Aber damit müsste es gehen. Probier mal aus.

          Comment

          Working...
          X