group by - Abfrage

Flosine

Benutzer
Beiträge
10
Guten Morgen Zusammen,

bin relativ unerfahren bei diesem Thema, muss halt hier und da mal einen Filter bei mir auf der Arbeit im ERP Programm setzen oder eine kleine Analyse starten. Daher bitte ich um verständnis wenn jetzt die ein oder andere blöde Frage kommen mag.

Das ERP Programm hier arbeitet scheinbar mit MS SQL, alles läuft Win7 Basis mit MS SQL Servern...

Nun müsste ich eine kurze Abfrage starten, welche eigentlich auch soweit gut Funktioniert:

Code:
Select
x.ARTIKEL
,x.AUFTRAG
,x.GESCH_BER
,x.KENN_RE
,x.BEZEICH
,x.AP_Jahr
,x.Menge

FROM (

select
ap.AUFTRAG
,ap.MENGE
,ap.ARTIKEL
,ap.KENN_RE
,Year(ap.DAT_NEU) as AP_Jahr
,ap.BEZEICH
,ak.GESCH_BER

FROM KAVV0101 as ap

inner join KAVV000 as ak on ak.AUFTRAG = ap.AUFTRAG

) as x

where x.ARTIKEL > '0' and x.KENN_RE = 'F' and x.ARTIKEL NOT LIKE 'CS%' and x.ARTIKEL NOT LIKE 'MV%'

group by x.ARTIKEL
order by x.ARTIKEL

Nun ist es aber so, das mir die Zeile mit der Gruppierung probleme macht, lasse ich die Zeile ("group by x.Artikel") raus läuft alles wunder bar, setzte ich diese wieder rein, so kommt folgende Fehlermeldung:

"Folgender Fehler wurde bei der Überprüfung des SQL Ausdruck festgestellt:

Subsystem: MS SQL, Error: 42000//8120
Column 'x.Auftrag' is invalid in the select list because it is not
contained in either an aggregate function or the GROUP BY clause.
Subsystem: MS SQL, Error: 42000/8180
Statement(s) could not be prepared."

Ich verstehe halt nicht was er für Probleme mit der "Group by" Funktion hat... in anderen Abfragen scheint diese auch zu gehen.

Würde mich freuen wenn mir jemand weiter helfen kann...

Vielen Dank
Florian
 
Werbung:
Nun ist es aber so, das mir die Zeile mit der Gruppierung probleme macht, lasse ich die Zeile ("group by x.Artikel") raus läuft alles wunder bar, setzte ich diese wieder rein, so kommt folgende Fehlermeldung:

Wenn Du gruppierst, müssen im Resultset alle Spalten entweder gruppiert oder aggregiert werden. Dies ist nicht der Fall.
 
Wenn Du gruppierst, müssen im Resultset alle Spalten entweder gruppiert oder aggregiert werden. Dies ist nicht der Fall.

Hmm also habe jetzt folgendes gemacht:

Code:
group by x.ARTIKEL, x.AUFTRAG, x.GESCH_BER, x.KENN_RE, x.BEZEICH, x.AP_JAHR, x.MENGE

Aber das Resultat sieht immer noch so aus, das nicht gruppiert sondern alles gelistet wird:
00010501 Wellendichtring
1
00010790 Doppelkohlebürste
72
00010793 Kohlebürste
36
00011030 Schneiddraht
10
01010802 Nutmutter 2
01034174 Ring
2
01034490 Nadel 2
01045303 SPEICHERBLASE
2
01045305 Berstscheibe 6
01045612 SCHUTZKONTAKT
3
01045612 SCHUTZKONTAKT
5
01045612 SCHUTZKONTAKT
20
01056448 ADAPTERPLATTE
1
01056613 Potentiometer
1
01056613 Potentiometer
1
01056613 Potentiometer
1
 
Hmm ok... dann kenne ich den unterschied nicht... wie gesagt ich hoffe du hast verständnis für mich...

Was ich erreichen möchte ist folgendes:

Ich habe eine Datenbank in der alle Auftragspositionen hinterlegt sind, aus dieser möchte ich die Artikel, deren Bezeichnung und die Menge je Position holen.
Dies ist auch kein Problem, funktioniert ja ohne das group by.

Nun möchte ich aber das alle doppelten Artikel und deren Mengen zusammen gefasst werden, so das ich z.B. nicht mehr

Artikel 1 - Bezeichnung - Menge 1
Artikel 2 - Bezeichnung - Menge 3
Artikel 1 - Bezeichnung - Menge 4

habe, sondern eben folgendes:

Artikel 1 - Bezeichnung - Menge 5
Artikel 2 - Bezeichnung - Menge 4

Dann habe ich mir wohl die falsche Abfrage dafür gesucht. Wie würde ich denn richtig vorgehen.

Danke
Gruß
Florian
 
Nun möchte ich aber das alle doppelten Artikel und deren Mengen zusammen gefasst werden, so das ich z.B. nicht mehr

Dann habe ich mir wohl die falsche Abfrage dafür gesucht. Wie würde ich denn richtig vorgehen.

Danke
Gruß
Florian


Code:
test=*# create table flosine (art_nr int, bez text, menge int);
CREATE TABLE
test=*# copy flosine from stdin;
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 1  bez1  1
>> 2  bez2  3
>> 1  bez1  4
>> \.
test=*# select * from flosine ;
 art_nr | bez  | menge
--------+------+-------
  1 | bez1 |  1
  2 | bez2 |  3
  1 | bez1 |  4
(3 rows)

test=*# select art_nr, bez, sum(menge) from flosine group by art_nr, bez;
 art_nr | bez  | sum
--------+------+-----
  2 | bez2 |  3
  1 | bez1 |  5
(2 rows)
 
So habe es grad probiert und folgendes draus gemacht... sollte doch nach meinem Verständnis so richtig sein, geht aber nicht kommt wieder ne Fehlermeldung:

Code:
Select
x.ARTIKEL
,x.AUFTRAG
,x.GESCH_BER
,x.KENN_RE
,x.BEZEICH
,x.AP_Jahr
,x.AP_Menge

FROM (

select
ap.Auftrag
,sum(ap.MENGE) as AP_Menge
,ap.ARTIKEL
,ap.KENN_RE
,Year(ap.DAT_NEU) as AP_Jahr
,ap.BEZEICH
,ak.GESCH_BER

FROM KAVV0101 as ap

inner join KAVV000 as ak on ak.AUFTRAG = ap.AUFTRAG

) as x

where x.ARTIKEL > '0' and x.KENN_RE = 'F' and x.ARTIKEL NOT LIKE 'CS%' and x.ARTIKEL NOT LIKE 'MV%'

group by x.ARTIKEL, x.AUFTRAG, x.GESCH_BER, x.KENN_RE, x.BEZEICH, x.AP_JAHR,x.AP_Menge
order by x.ARTIKEL

Fehlermeldung:
Subsystem: MS SQL, Error: 42000/8120
Column 'XXXX.AUFTRAG' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Subsystem: MS SQL, Error: 42000/8180
Statement(s) could not be prepared
 
So habe es grad probiert und folgendes draus gemacht... sollte doch nach meinem Verständnis so richtig sein, geht aber nicht kommt wieder ne Fehlermeldung:

Code:
FROM (

select
ap.Auftrag
,sum(ap.MENGE) as AP_Menge
,ap.ARTIKEL
,ap.KENN_RE
,Year(ap.DAT_NEU) as AP_Jahr
,ap.BEZEICH
,ak.GESCH_BER

FROM KAVV0101 as ap

inner join KAVV000 as ak on ak.AUFTRAG = ap.AUFTRAG

) as x

Fehlermeldung:
Subsystem: MS SQL, Error: 42000/8120
Column 'XXXX.AUFTRAG' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Subsystem: MS SQL, Error: 42000/8180
Statement(s) could not be prepared

Siehe meine Antwort #1. Im inneren Select verstößt Du dagegen.
 
Müsste aber noch was fragen...

Er summiert jetzt alles zusammen, was die selbe Artikelnummer hat, sollte er ja auch... aber er unterscheidet immer noch im Ergebnis wie folgt nach dem Auftrag:

Artikel1 - Bezeich1 - Menge 2 - Auftrag 1
Artikel1 - Bezeich1 - Menge 1 - Auftrag 2
Artikel1 - Bezeich1 - Menge 1 - Auftrag 3
Artikel2 - Bezeich2 - Menge 1 - Auftrag 4
Artikel2 - Bezeich2 - Menge 2 - Auftrag 5

Wie kann ich denn jetzt noch dafür sorgen, das der Auftrag nicht berücksichtigt wird. Brauche die Auftragsnummer allerdings als gemeinsamen Nenner um die Daten aus den beiden Tabellen zusammen zu führen...
 
Wie kann ich denn jetzt noch dafür sorgen, das der Auftrag nicht berücksichtigt wird.

Das ist einfach: durch weglassen.

Brauche die Auftragsnummer allerdings als gemeinsamen Nenner um die Daten aus den beiden Tabellen zusammen zu führen...

Hä? Wenn Du 3 Aufträge addierst (Menge), was willst Du dann als Auftragsnummer haben? Den Durchschnitt der Auftragsnummern, die Quersumme, die höchste?
 
Sorry habe mich wohl unverständlich ausgedrückt...

Also ich habe zwei Tabellen, in der ersten befinden sich:

Auftrag, Artikel, Bezeichnung, Menge etc.

In der zweiten: Auftrag und Geschäftsbereich

Da ich den Geschäftsbereich aber Filtern muss, und die Auftragsnummer der einzige gemeinsamme Nenner in den beiden Tabellen ist, brauche ich diese für die Zuordnung, möchte sie aber nicht im Ergebnis haben bzw. eben halt auch der Summierung/ Gruppierung.

Hoffe das ich mich jetzt verständlicher ausgedrückt habe...
 
Sorry habe mich wohl unverständlich ausgedrückt...

Also ich habe zwei Tabellen, in der ersten befinden sich:

Auftrag, Artikel, Bezeichnung, Menge etc.

In der zweiten: Auftrag und Geschäftsbereich

Da ich den Geschäftsbereich aber Filtern muss, und die Auftragsnummer der einzige gemeinsamme Nenner in den beiden Tabellen ist, brauche ich diese für die Zuordnung, möchte sie aber nicht im Ergebnis haben bzw. eben halt auch der Summierung/ Gruppierung.

Hoffe das ich mich jetzt verständlicher ausgedrückt habe...


Dann joinst Du erst einmal und aggregierst darauf. Du schaffst das.
 
Werbung:
Danke für das Mut machen... aber wie joine ich denn zuerst...setze ich mein "inner join" unter mein erstes Select?

Code:
Select
x.ARTIKEL
,x.GESCH_BER
,x.KENN_RE
,x.BEZEICH
,x.AP_Jahr
,x.AP_Menge

FROM (

select

sum(ap.MENGE) as AP_Menge
,ap.ARTIKEL
,ap.KENN_RE
,Year(ap.DAT_NEU) as AP_Jahr
,ap.BEZEICH
,ak.GESCH_BER

FROM KAVV0101 as ap

inner join KAVV000 as ak on ak.AUFTRAG = ap.AUFTRAG

group by ap.ARTIKEL, ap.KENN_RE, ap.BEZEICH, ap.DAT_NEU, ak.GESCH_BER

) as x

where x.ARTIKEL > '0' and x.KENN_RE = 'F' and x.ARTIKEL NOT LIKE 'CS%' and x.ARTIKEL NOT LIKE 'MV%'


order by x.ARTIKEL
 
Zurück
Oben