Summe in SQL ohne redundante Werte

gamma_matrices schrieb:
Wie ist den eigentlich das x in der Zeile über den letzten Group by zu interpretieren?
Das ist der Alias für die Subquery. Darauf bezieht sich dann die äußere Query.
gamma_matrices schrieb:
Falls das so gemeint ist, bekomme ich leider Fehler in Zeile 1 als "ungültiger Bezeichner" für v.price?
Du hast ja auch die Subquery nicht benannt. Hinter der Subquery fehlt das x.

Außen darfst du dich dann nur auf die Subquery (x) selbst beziehen, nicht auf die Tabellen innerhalb der Subquery.

Außerdem hast du innerhalb der Subquery nicht alle Spalten drin. Wenn, dann mach es bitte auch genau so wie beschrieben und nicht irgendwie anders.
 
Ich habe leider bis jetzt mit Unterabfragen noch nicht viel zu tun gehabt und deswegen irritiert mich das auch bisschen!
 
Setz es einfach so um wie in meinem Beispiel. Alle relevanten Spalten müssen in die Subquery. Das GROUP BY ersetzt das DISTINCT, also lässt du das DISTINCT weg.
In der äußeren Query verwendest du dann nur noch die ID und den Preis und gruppierst dort entsprechend nur noch auf die ID.
 
SQL:
select v.id, sum(v.price) as summe
from (select t.datum, v.price
      from table_1 v join table_2 t on
      v.id = t.id
      where t.datum >= '...' and t.datum < '...'
      group by t.datum, v.price) as x
where v.vnr = '...'   
group by v.id;

Jetzt bekomme ich Fehler "SQL-Befehl wurde nicht korrekt beendet" in Zeile 6! Ich kann doch nicht mit 2 ";" die Query ja nicht abschließen!
 
Du beziehst dich schon wieder außerhalb der Subquery auf Inhalte, die ausschließlich in der Subquery enthalten sind.

Nochmal: außerhalb der Subquery darfst du dich nicht mehr auf "v." beziehen. Das gibt es da nämlich nicht mehr. Außerhalb der Subquery gibt es nur noch "x." und sonst nix.

Und außerdem ist die Query immer noch komplett falsch und sieht vom Aufbau her anders aus als mein Beispiel.

Ich vermute, ein paar SQL-Grundlagen wären ganz angebracht. Versuch zu verstehen, was du da tust und warum du es tust. Das können wir hier im Forum aber auf keinen Fall leisten.

Ich wünsche dir dabei viel Erfolg! Man lernt nämlich nie aus, und man lernt aus seinen Fehlern.
 
So abrupt einfach abzubrechen, ist jetzt auch nicht die feine Art! Ich versuche nur nachzuvollziehen, damit nicht unnötig Missverständnisse entstehen. Ich habe leider mich vorher mit Unterabfragen noch nie auseinander gesetzt gehabt und das wegen wirkt es mit deiner initialen Darstellung etwas verwirrend - sorry!
Also ich fasse jetzt alles nochmal zusammen:

Die folgende Query

SQL:
select distinct v.id, sum(v.price) as summe, t.datum
from table_1 v join table_2 t on
v.id = t.id
where v.vnr = '...' and t.datum >= '...' and t.datum < '...'
group by v.id, t.datum

sollte mit einer Subquery erweitert werden, welche bereits mit x als Alias bezeichnet wurde

SQL:
select x.id, sum(x.price) as summe
from (select id, datum, preis  -- warum haben die Spalten hier KEINEN Tabellenbezug?
      from table_1 v join table_2 t on -- kann die Verknüpfung hier stehen gelassen werden?
      v.id = t.id                                    -- was ist eigentlich mit der table_2 t?
      group by id, datum, price)
x -- was GENAU kommt in dieser Zeile? Nochmal eine Subquery?
group by x.id;

Ich habe jetzt meine noch offenen Fragen in dem 2. Codeabschnitt verfasst und wäre sehr nett, wenn Aufschlüsse angeboten werden könnten.
 
Zuletzt bearbeitet:
Ich empfehle Subqueries grundsätzlich zu vermeiden, da diese in gewissen Fällen von der Datenbank nicht optimiert werden und dann zu sehr langen Ausführzeiten führen können.
Wann immer es geht entweder mit Joins arbeiten oder/und statt dessen Derived Tables verwenden.
Letzteres wird wahrscheinlich auch in deinem Fall das SQL an sich am übersichtlichsten halten.

Ich hab jetzt nicht den Überblick, was jetzt am Ende deine genauen Anforderungen sind, deswegen hier ein Beispiel anhand deines SQLs im Eingangspost:
SQL:
select id, datum, sum(summe)
from (select v.id id, v.price summe, t.datum datum
      from table_1 v join table_2 t on v.id = t.id
      where t.datum >= '...' and t.datum < '...'
      group by v.id, t.datum, v.price)
group by id, datum

Ergänzung:
Distinct ist nicht immer das, was es scheint.
Je nach DBMS und Formulierung, bzw. Strukturierung des SQLs wird dabei im Hintergrund nichts anderes gemacht, als ein Group By auf alle nicht aggregierten Spalten.
Ich empfehle deswegen auch einen großen Bogen um Distinct zu machen.
Meistens hat man sowieso einen Denkfehler oder einen Schritt ausgelassen, wenn man 5 oder mehr (Ausnahmen bestätigen die Regel) Spalten in sein Group By packen muss.
Außerdem lassen sich auf diese Weise auch Arten von Nutzdaten mit einem Group By "verwenden", die nicht gruppierbar sind. (z.B. BLOBs & Co.)
In den allermeisten Fällen, die mir untergekommen sind, waren dann auch da Derived Tables mit dem Selektieren entsprechender Primary und Foreign Keys und anschließendes Joinen der Nutzdaten-Tabellen auf die Derived Table die sinnvollere Lösung.
 
Zuletzt bearbeitet: (Ergänzung/Korrektur)
  • Gefällt mir
Reaktionen: gamma_matrices
Perfekt, vielen Dank funktioniert soweit auf Oracle nur MSSQL bockt leider mit dem Error:
"Falsche Syntax in der Nähe des group-Schlüsselworts".
 
Zuletzt bearbeitet:
Zurück
Oben