SQL Abfrage Bestellung

0plan

Bekanntes Mitglied
Hallo,

ich beschäftige mich momentan mit SQL bin da leider noch nicht so fit. Meine Frage bezieht sich auf folgende Anweisung

Java:
SELECT bk_bestellung_id, bk_lieferantenname, bk_status, bk_lieferdatum, bk_auftragsnummer, BZ_GEWICHT
       FROM BESTELLKOPF, BESTELLZEILEN
             WHERE bk_bestellung_id = bz_bestellung_id
                  AND upper(BK_LIEFERANTENNAME) LIKE upper('%' || :Lieferant || '%')
                  AND BK_LIEFERDATUM between to_date('01.01.2012') AND to_date('31.12.2012')
                  AND bk_status <>'STORNIERT'
                  order by BK_LIEFERDATUM

Diese ABfrage erstellt mir die benötigte Tabelle mit den Werten die ich brauche, in dieser Ergebnistabelle befindet sich dann auch die Spalte BZ_GEWICHT.

Ich muss diese BZ_Gewicht Spalte nun aber addieren, da es darum eigentlich auch geht. Wie bekomme ich denn auf die Ergebnistabelle am Schluss die sum() Funktion auf eine Spalte der Tabelle?
 
Zuletzt bearbeitet von einem Moderator:

Evil-Devil

Top Contributor
Die Gewichtssumme bezieht sich auf eine Lieferung oder?
In dem Fall gruppierst du einfach nach bk_bestellung_id.

[sql]
SELECT bk_bestellung_id, bk_lieferantenname, bk_status,
bk_lieferdatum, bk_auftragsnummer, BZ_GEWICHT,
SUM(BZ_GEWICHT) as lieferungsgewicht
FROM BESTELLKOPF, BESTELLZEILEN
WHERE bk_bestellung_id = bz_bestellung_id
AND upper(BK_LIEFERANTENNAME) LIKE upper('%' || :Lieferant || '%')
AND BK_LIEFERDATUM BETWEEN to_date('01.01.2012') AND to_date('31.12.2012')
AND bk_status <>'STORNIERT'
GROUP BY bk_bestellung_id
ORDER BY BK_LIEFERDATUM
[/sql]

Das sollte dir das gewünschte Ergebnis zurückliefern, wenn ich dich richtig verstanden habe.
 

0plan

Bekanntes Mitglied
Das hast du richtig erkannt, jedoch bekomme ich eine Fehlermeldug

ORA - Kein Group By Ausdruck

wenn ich die Abfrage ausführe
 

Evil-Devil

Top Contributor
Ok, dann frag am besten den Kollegen wieso das Group By dort nicht funktioniert, weil wenn ich über Google mir das Group By zu Oracle SQL anschaue erkenne ich keinen Unterschied.

Alternativ den SQL Befehl direkt auf dem Datenbank Server mal ausprobieren :)
 
S

SlaterB

Gast
meines Wissens nach muss man nach der ganzen Reihe an abgefragen Attributen, nach
> bk_bestellung_id, bk_lieferantenname, bk_status, bk_lieferdatum, bk_auftragsnummer, BZ_GEWICHT
auch gruppieren,

das dürfte SQL-Standard sein, oder wirklich anders kennengelernt?
dass bk_bestellung_id vielleicht Primärschlüssel ist, und damit auch andere eindeutig werden läßt,
ist wohl bisschen zu viel an Intelligenz für eine Query erwartet, die geht eher technischer vor

alternative Abkürzung geht irgendwie Richtung
SELECT DISTINCT a, b, c, usw.

---

edit:
wenn BZ_GEWICHT summiert wird, dann danach natürlich NICHT selektieren + gruppieren
 
Zuletzt bearbeitet von einem Moderator:

0plan

Bekanntes Mitglied
Slater hat recht, ich habe natürlich vergessen die Felder zu gruppieren. Es funktioniert jetzt alles. Leider sind die Fehlermeldung bei dem selbst programmierten Programm nicht so ausführlich was mich teilweise verwirrt. Das ist auch meine erste Abfrage wofür ich Group By verwenden musste, daher mein weniger fundiertes Fachwissen diesbezüglich. Danke an alle
 

Evil-Devil

Top Contributor
Gruppieren und selektieren geht natürlich in SQL. Alles andere wäre ja sinnlos, wenn man Aggregat Funktionen nur alleine ausführen kann.

@mehr gruppieren: Das kommt ganz darauf an nach was man die Zeilen aufgesplittet haben will.
Wenn er zb. noch wissen will wv. die die Inhalte des jeweiligen Herstellers wiegen würden, könnte er zusätzlich zur Lieferungs ID noch nach der Hersteller ID gruppieren. Die Möglichkeiten sind nahzu endlos ;)

[edit]
Erwartet Oracle tatsächlich das man alle Felder noch einmal angibt? Das ist afaik kein SQL Standard und wenn dann ein sehr alter.
[/edit]
 

0plan

Bekanntes Mitglied
Erwartet Oracle tatsächlich das man alle Felder noch einmal angibt? Das ist afaik kein SQL Standard und wenn dann ein sehr alter.
Das hat mich auch verwirrt, find ich ziemlich nervig

Ergebnis sieht nun so aus :

SQL:
SELECT BK_LIEFERANTENNAME as LIEFERANT,
       BZ_WERKSTOFF,
       BZ_ARTIKELGRUPPE,
       BZ_AD_1,
       BZ_WS_1,
       BZ_MENGE,
       BZ_EINGANG,
       BZ_LIEFERJAHR as LIEFERJAHR,
       SUM(BZ_GESAMTGEWICHT) as GESAMT_GEWICHT

       FROM BESTELLKOPF, BESTELLZEILEN
             WHERE bk_bestellung_id = bz_bestellung_id
                  AND upper(BK_LIEFERANTENNAME) LIKE upper('%' || :Lieferant || '%')
                  AND BZ_LIEFERJAHR ='2012'
                  AND bk_status <>'STORNIERT'
                  AND bk_status <>'GESTOPPT'
                  GROUP BY BK_LIEFERANTENNAME, BZ_LIEFERJAHR, BZ_MENGE, BZ_WERKSTOFF, BZ_ARTIKELGRUPPE, BZ_EINGANG, BZ_AD_1, BZ_WS_1
                  ORDER BY LIEFERANT
 
S

SlaterB

Gast
Erwartet Oracle tatsächlich das man alle Felder noch einmal angibt? Das ist afaik kein SQL Standard und wenn dann ein sehr alter.
was wäre die Alternative, wie erklärst du diese?
soll man gar kein Group By schreiben?
du hast ja selber eins eingefügt mit einem Attribut, wieso gerade dieses und warum sollte es reichen?
wie ich schon fragte weil (hoffentlich) Primärschlüssel?

wenn das nicht wäre und man nach 4 beliebig kombiniert verteilten Kategorien gruppieren möchte,
wären dann zumindest alle 4 aufzuführen?

bei Joins, vielleicht Attributen von mehreren Tabellen, etwa hier auch was von BESTELLZEILEN,
hätte man ja ganz schön nachzudenken, was reicht und was doch einzeln genannt werden muss..
 
Zuletzt bearbeitet von einem Moderator:

Evil-Devil

Top Contributor
wenn das nicht wäre und man nach 4 beliebig kombiniert verteilten Kategorien gruppieren möchte,
wären dann zumindest alle 4 aufzuführen?
Ja wären sie.

Nach jeder Spalte die man aggregiert haben will gruppiert man. Im Beispiel brauchten wir nur eine Spalte.

In seinem Beispiel waren es die Gesamtgewichte pro Lieferung. Wenn er zusätzlich noch nach Gewicht gruppiert hätte, hätte er neben den Liefergewicht auch das Einzelgewicht jedes Artikels erhalten.


Allerdings kann man mit Group By auch einige witzige/nützliche Dinge machen.
Zb. Altersbereiche gruppieren.

[sql]
select count(*) as anzahl, min(age) as min_age, max(age) as max_age
from teilnehmer_menge
group by age between 18 and 30, age between 31 and 45, age between 46 and 65
[/sql]

Im Select könnte man noch IF/SWITCH einbauen für genauere Bezeichner, nur ist das bei solch speziellen Abfragen meist überflüssig.
 
S

SlaterB

Gast
> Nach jeder Spalte die man aggregiert haben will gruppiert man. Im Beispiel brauchten wir nur eine Spalte. [..] waren es die Gesamtgewichte

was haben die Gewichte mit der Gruppierung zu tun? die Gewichte sind das EINZIGE, nach dem NICHT gruppiert wird ;) ,
dort nur die Summe und fertig,

die Summe über die ganze Tabelle wäre ganz ohne Gruppierung zu schaffen,
aber die will man ja nicht, sondern nach 1-n Attributen

nochmal mit Beispielen angefangen:
[sql]
select a, summe(gewicht) from x
group by a
[/sql]
wirst du sicherlich zustimmen

nun aber
[sql]
select a, b summe(gewicht) from x
group by a, b
[/sql]
warum hier nicht sowohl nach a und b gruppieren? was spricht dagegen, was wäre die Alternative?
(außer DISTINCT-Schreibweise vielleicht)
 

Evil-Devil

Top Contributor
In deinem Beispiel verwendest du nur eine Tabelle. Wir haben oben zwei Tabellen.

Warum soll denn nach a und b gruppiert werden? Du gruppierst doch nur auf das was du gruppieren willst.
Wie eben oben das Gewicht pro Lieferung und das Einzelgewicht entstammt den Positionen.

Wenn ich jetzt also das Gesamtgewicht der Lieferung und die Einzelgewichte haben will kann ich nach a und b gruppieren. Will ich aber nur das Gesamtgewicht haben gruppiere ich nur nach a.

Irgendwie drehen wir uns im Kreis ^^"

[sql]
select a.lieferungs_id, sum(b.gewicht) gesamt
from lieferung a, positionen b
where a.lieferungs_id = b.lieferungs_id
group by a.lieferungs_id
[/sql]

1 / 220
2 / 120
3 / 600


[sql]
select a.lieferungs_id, b.gewicht, sum(b.gewicht) gesamt
from lieferung a, positionen b
where a.lieferungs_id = b.lieferungs_id
group by a.lieferungs_id, b.positions_id
[/sql]

1 / 60 / 220
1 / 70 / 220
1 / 90 / 220
2 / 40 / 120
2 / 40/ 120
2 / 40 / 120
3 / 200 / 600
3 / 100 / 600
3 / 300/ 600
 
Zuletzt bearbeitet:
S

SlaterB

Gast
schau dir die Struktur der Query um die es hier geht, an,
es wird ein Gewicht summiert, mehr ist dazu nicht zu sagen, auch wenn es anscheinend mehrere Spalten gibt,
für die Query ist nur wichtig dass da sum(spalte) steht, als zu Einzelgewicht usw. bitte nicht mehr abzweigen,
es wird ein Gewicht summiert,

was die Summe bedeutet, pro Lieferung, pro Jahr usw., das hängt von den restlichen Attributen der Query ab,
und meine Aussage ist:
da stehen noch 5 weitere, "bk_bestellung_id, bk_lieferantenname, bk_status, bk_lieferdatum, bk_auftragsnummer",

dass das inhaltlich 'pro Lieferung, Rest Beiwerk' bedeutet, kann man meiner Ansicht nach von der Query nicht als Interpretation zumuten,
es sind ganz einfach 5 beliebige Attribute, und daher muss nach allen 5 gruppiert werden, Ausnahmen gibts nicht, alle sind gleich

naja, spannend ist das auch nicht weiter, bei mir bei Oracle geht es eh nur so, das sehe ich ja selber
 

Evil-Devil

Top Contributor
dass das inhaltlich 'pro Lieferung, Rest Beiwerk' bedeutet, kann man meiner Ansicht nach von der Query nicht als Interpretation zumuten,
es sind ganz einfach 5 beliebige Attribute, und daher muss nach allen 5 gruppiert werden, Ausnahmen gibts nicht, alle sind gleich

Naja, wie ich gerade aufm Wikipedia Artikel lesen durfte lassen tatsächlich einige Hersteller diese Optimierung weg - sprich man muss wie von euch aufgezeigt alles angeben. SQL sieht dies normalerweise nicht vor. Und von MySQL und MS SQL kenne ich es auch nicht anders.

Ich stell mir das jedenfalls sehr nervig vor, wenn ich einen Query mit vielen Spalten und Funktionen hätte. Den müsste ich ja erst in kleinere aufdröseln im schlechtesten Fall.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Wie kann ich eine Jtable mit Inhalt einer SQL Abfrage füllen Datenbankprogrammierung 14
J SQLite Abfrage fehlerhaft - komme nicht weiter - please help. Datenbankprogrammierung 3
L PostgreSQL Abfrage mit EclipseLink Datenbankprogrammierung 7
S Berechnung des Datumsunterschieds in der SQL-Abfrage Datenbankprogrammierung 1
Zrebna Probleme bei Überführung von SQL-Code in eine HQL-Abfrage Datenbankprogrammierung 3
btwX28 mysql abfrage über phpmyadmin Datenbankprogrammierung 8
M Alle Records Felder kriegen für DB Abfrage Datenbankprogrammierung 14
pkm PostgreSQL Kann mit mybatis einen Parameter für eine postgreSQL-Abfrage nicht übergeben. Datenbankprogrammierung 5
nonickatall MySQL SQL Abfrage erneut ausführen oder rs aktualisieren Datenbankprogrammierung 14
Kirby.exe Verständnisproblem bei SQL Abfrage Datenbankprogrammierung 27
N SQL-Abfrage in JTextField ausgeben Datenbankprogrammierung 6
N java sql abfrage bestimmer Datumszeitraum Datenbankprogrammierung 9
F Mapping einer SQL Abfrage in eine Klasse Datenbankprogrammierung 4
N Java Abfrage über GUI, Daten hinzufügen Datenbankprogrammierung 54
Bluedaishi Datenbank Abfrage Datenbankprogrammierung 36
W MySQL DB Abfrage in Array, gemischte Array, generelles vorgehen Datenbankprogrammierung 4
D SQL Abfrage optimieren Datenbankprogrammierung 35
D MySQL Abfrage Datenbankprogrammierung 5
D MySQL Abfrage sortieren Datenbankprogrammierung 4
D MySQL Abfrage SUM datediff Datenbankprogrammierung 3
D Regelmäßige Abfrage aus Workbench Datenbankprogrammierung 6
M SQL-Statement Hilfe bei SQL-Abfrage Datenbankprogrammierung 2
D Abfrage - Spalte(Datum) ändern (Oracle) Datenbankprogrammierung 7
D Datenbank Abfrage Datenbankprogrammierung 7
H MySQL Benutzer Login System mit Datenbank Informationen (Abfrage zu User ist auf DB gesichert) Datenbankprogrammierung 42
D MySQL Abfrage mit kumulierten Werten Datenbankprogrammierung 16
M MySQL Anbindung und Abfrage an die Datenbank Datenbankprogrammierung 2
RowdyN SQLite Einfache Abfrage mit temporäre Tabelle, die nur innerhalb der Abfrage gültig ist Datenbankprogrammierung 0
E Abfrage auf HSQLDB Datenbankprogrammierung 4
M MySQL SQL Abfrage in JTable mit Berechnung Datenbankprogrammierung 3
S Abfrage von Gruppentickets(Mehrere Resorts an einem Tag) Datenbankprogrammierung 1
S SQL Abfrage Datenbankprogrammierung 2
F Abfrage der letzten Einträge Datenbankprogrammierung 2
J SELECT Abfrage/Suche Datenbankprogrammierung 4
U SQLite Für mich etwa komplexe Abfrage via 2 Tabellen Datenbankprogrammierung 5
OnDemand SQL Abfrage und Equals Datenbankprogrammierung 4
B MySQL MySQL-Abfrage von aufsummierter Zeit Datenbankprogrammierung 3
M MySQL MySQLSyntaxError in Java, obwohl Abfrage in HeidiSQL korrekt Datenbankprogrammierung 2
ruutaiokwu sql abfrage mit rekursion, mit oder ohne cte... Datenbankprogrammierung 5
J SQLite Abfrage ausführen stoppt für Zyklus? Wie es zu lösen? Datenbankprogrammierung 3
L JSONArray/JSONObject MySQL-Servlet Abfrage Datenbankprogrammierung 2
H Derby: SYSCS_UTIL.SYSCS_EXPORT_QUERY mit String Abfrage in wehre-Klausel nicht möglich Datenbankprogrammierung 3
L SQL-Abfrage bricht vor dem Ende ab Datenbankprogrammierung 2
S MySQL Abfrage über mehrere Tabellen + Einträge werden überschrieben Datenbankprogrammierung 1
M Derby/JavaDB Komplexe Abfrage vereinfachen Datenbankprogrammierung 2
S SQL-Abfrage, Filewriter .txt Datei Datenbankprogrammierung 2
P Datenbank- Abfrage mit null'en Datenbankprogrammierung 2
Bluedaishi MySQL Abfrage Problem :-) Datenbankprogrammierung 21
D MySQL Erstellen der richtigen Abfrage Datenbankprogrammierung 3
D MySQL DB Abfrage Prüfen Datenbankprogrammierung 10
D JDBC insert mit select abfrage Datenbankprogrammierung 5
E PostgreSQL Exception too ...many clients already bei DB-Abfrage Datenbankprogrammierung 14
M MySQL SQL Abfrage Problem Datenbankprogrammierung 6
W No data found: SQL-Abfrage funktioniert nur beim Debuggen Datenbankprogrammierung 3
E Abfrage nach existierender SQL-Tabelle Datenbankprogrammierung 7
H JSON Array abfrage beschleunigen Datenbankprogrammierung 2
S MySQL Abfrage: Wenn Feld leer, alles anzeigen Datenbankprogrammierung 5
Mrtwomoon Abfrage-Ergebnisse in einem Fenster darstellen Datenbankprogrammierung 8
G SQLite SQLite Abfrage Datenbankprogrammierung 4
C Mit jsp über Java eine DB Abfrage durchführen --> java.lang.ClassNotFoundException Datenbankprogrammierung 4
Dit_ Hibernate, effiziente SQL-Abfrage definieren Datenbankprogrammierung 5
B My-SQL Abfrage - Out Of Memory Error Datenbankprogrammierung 13
C MySQL Problem mit UPDATE Abfrage Datenbankprogrammierung 13
K SQLite Einfache DB-Abfrage Datenbankprogrammierung 2
C Problem mit SQL-Abfrage Datenbankprogrammierung 5
C Sortierung bei SQL-Abfrage Datenbankprogrammierung 3
B Bei Abfrage schießt der Speicher in die Höhe Datenbankprogrammierung 6
M SQL Abfrage Dupliakte bei Kreuzvergleich Datenbankprogrammierung 2
M Access Abfrage mit Parameter & Access/Java liefern unterschiedliche Ergebnisse Datenbankprogrammierung 2
G SQL Abfrage Datenbankprogrammierung 5
C SQL-Abfrage Datenbankprogrammierung 4
B SQL-Abfrage Datenbankprogrammierung 4
R SQL Abfrage, je nach ausgewählten Parametern Datenbankprogrammierung 11
C Wert in SQL-Abfrage zählen lassen Datenbankprogrammierung 8
R Memory leaks bei DB Abfrage Datenbankprogrammierung 16
S Abfrage auf SQLite-DB Datenbankprogrammierung 2
I Belastet es das System zu sehr einen Timer jede 0.2 Sekunden eine DB Abfrage machen zu lassen? Datenbankprogrammierung 9
L MySQL Probleme mit PreparedStatement für SQL-Abfrage in Java Datenbankprogrammierung 2
G Abfrage von Teilnehmern Datenbankprogrammierung 4
B HSQLDB Probleme mit Select...Where Abfrage Datenbankprogrammierung 16
G JOIN Abfrage über mehrere Tabellen Datenbankprogrammierung 15
F MySQL SQL Abfrage für u.a. Spaltenname key Datenbankprogrammierung 4
G SQLite Abfrage, ob in Tabelle X Spalte Y existiert Datenbankprogrammierung 4
A MySQL Ergebnss aus SQL Abfrage in Hauptklasse verwenden Datenbankprogrammierung 3
N Geschwindigkeit bei if Abfrage Datenbankprogrammierung 11
J sql abfrage ... Problem mit Datumswert Datenbankprogrammierung 3
G Performante SQL- Abfrage (LIKE %) Datenbankprogrammierung 21
G Join Abfrage Datenbankprogrammierung 12
M db abfrage fehlerhaft Datenbankprogrammierung 5
C MySQL Abfrage mit flexibler WHERE bedingung Datenbankprogrammierung 10
C Datenbank-Abfrage, if im Select Datenbankprogrammierung 9
S MySQL Frage zu LeftJoin Abfrage Datenbankprogrammierung 2
G SQL Abfrage über mehrere Tabellen Datenbankprogrammierung 28
H SQL Abfrage - zwei tabellen vergleichen. Datenbankprogrammierung 2
H MySQL Datenbank Abfrage Datenbankprogrammierung 10
André Uhres SQL Abfrage erkennt keine Buchstaben mit Akzenten (z. B. é, è) Datenbankprogrammierung 3
E MySQL Klasse zur Abfrage statisch oder Standard Datenbankprogrammierung 5
J Mit einer Abfrage Worte suchen die in Zwei Tabellen enthalten sind Datenbankprogrammierung 5
G M:N Abfrage Datenbankprogrammierung 2
J where Abfrage auf ein mysql date feld Datenbankprogrammierung 5

Ähnliche Java Themen

Neue Themen


Oben