Benutzer mit den meisten Antworten
group by nicht alle Spalten

Frage
-
Hallo.
Es gab einige ähnliche Threads, aber ich komme nicht weiter.
Ich möchte 2 Werte summieren und gruppieren nach Artikelnummer. Das Problem ist nur, das der Artikelname mitgeliefert werden muss, der wurde aber in einigen Fällen geändert, ich müsste den aus der Stammtabelle holen, bekomme aber immer einen Konflikt mit der Aggregatfunktion.
select Artikelnummer, Artikelname, sum(Menge) as Menge, sum(Menge*Gewicht) as GewichtTotal
group by Artikelnummer [wäre gewünscht, geht aber nicht beim MSSQL)--
group by Artikelnummer, Artikelname (funktioniert, aber gibt nicht die Summe je Artikelnummer aus)
Es kommt dies heraus:
Artikelnummer / Artikelname / Menge / Gewicht
123456 Artikel1 1 4
123456 Artikel1xx 2 4
123789 Artikel2 2 5Es sollte aber dieses Ergebnis sein:
Artikelnummer / Artikelname / Menge / Gewicht
123456 Artikel1 3 8
123789 Artikel2 2 5Ich hole dazu den Artikelname aus einer 2. Tabelle
SELECT ARTIKEL.Artikelname, VERKAUF.Artikelnummer, sum(VERKAUF.Menge) as Menge, sum(VERKAUF.Menge*VERKAUF.Gewicht) as GewichtTotal
group by Artikelnummer
FROM ARTIKEL INNER JOIN
VERKAUF ON ARTIKEL.Artikelnummer = VERKAUF.Artikelnummeraber wieder hat mich die Aggregatfunktion eingeholt.
Hat jemand die passende Lösung?Gruss Rolf
Antworten
-
Hallo Rolf,
mein erstes Beispiel würde zwar auch funktionieren, ist aber wohl nicht notwendig. Ich hatte da etwas falsches in der Birne, daher hier ein weiteres Beispiel.
SELECT v.Artikelnummer, a.Artikelname, v.SUM( Menge ) AS Menge, v.SUM( Menge * Gewicht ) AS GewichtTotal GROUP BY v.Artikelnummer, a.Artikelname FROM VERKAUF v INNER JOIN ARTIKEL a ON a.Artikelnummer = v.Artikelnummer
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Stefan FalzModerator Donnerstag, 16. April 2015 22:17
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 24. April 2015 08:42
-
Hallo Stefan
Da war ich zu schnell beim Lesen (o;
Also mit 2 Tabellen, wobei ich hier das Gewicht zur Artikeltabelle genommen habe (o;
select artikel.artikelid, artikel.name, sum(verkauf.menge) as menge, sum(artikel.gewicht * verkauf.menge) as gewicht from artikel, verkauf where artikel.artikelid = verkauf.artikelid group by artikel.artikelid, artikel.name
ergibt bei mir:
artikelid name menge gewicht 123456 Artikel1 3 12 123789 Artikel2 2 10
Also ich summiere hier das Gewicht, was bei der ursprünglichen Vorgabe nicht genau ersichtlich ist.- Bearbeitet Richard Klingler Donnerstag, 16. April 2015 19:13
- Als Antwort vorgeschlagen Stefan FalzModerator Donnerstag, 16. April 2015 22:17
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 24. April 2015 08:42
Alle Antworten
-
Hallo Rolf,
probiers mal damit.
WITH GroupedQuery AS ( SELECT Artikelnummer, SUM( Menge ) AS Menge, SUM( Menge * Gewicht ) AS GewichtTotal GROUP BY Artikelnummer FROM VERKAUF ) SELECT a.Artikelname, gq.Artikelnummer, gq.Menge, gq.GewichtTotal FROM GroupedQuery gq INNER JOIN ARTIKEL a ON a.Artikelnummer = gq.Artikelnummer
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Keine Ahnung, ob bei Deiner Tabelle der Artikelname "unique" ist oder nicht....Hab's mal schnell in meiner Postgresql DB getestet:
select artikel, name, sum(menge) as menge, sum(gewicht) as gewicht from artikel group by artikel, name;
Ergibt bei mir dann:
artikel name menge gewicht 123456 Artikel1 3 8 123789 Artikel2 2 5
Aber vielleicht ist da SQL Server ganz anders....- Bearbeitet Richard Klingler Donnerstag, 16. April 2015 18:26
-
Hallo Richard,
Rolf hat zwei Tabellen, eine mit den Verkaufsdaten und die Artikelstammtabelle. Die Daten an sich kommen aus Verkauf, der Artikelname soll aus Artikel kommen.
Dein Beispiel hat nur eine Tabelle, da ist das so wie von dir gezeigt, auch problemlos machbar.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Rolf,
mein erstes Beispiel würde zwar auch funktionieren, ist aber wohl nicht notwendig. Ich hatte da etwas falsches in der Birne, daher hier ein weiteres Beispiel.
SELECT v.Artikelnummer, a.Artikelname, v.SUM( Menge ) AS Menge, v.SUM( Menge * Gewicht ) AS GewichtTotal GROUP BY v.Artikelnummer, a.Artikelname FROM VERKAUF v INNER JOIN ARTIKEL a ON a.Artikelnummer = v.Artikelnummer
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community- Als Antwort vorgeschlagen Stefan FalzModerator Donnerstag, 16. April 2015 22:17
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 24. April 2015 08:42
-
Hallo Stefan
Da war ich zu schnell beim Lesen (o;
Also mit 2 Tabellen, wobei ich hier das Gewicht zur Artikeltabelle genommen habe (o;
select artikel.artikelid, artikel.name, sum(verkauf.menge) as menge, sum(artikel.gewicht * verkauf.menge) as gewicht from artikel, verkauf where artikel.artikelid = verkauf.artikelid group by artikel.artikelid, artikel.name
ergibt bei mir:
artikelid name menge gewicht 123456 Artikel1 3 12 123789 Artikel2 2 10
Also ich summiere hier das Gewicht, was bei der ursprünglichen Vorgabe nicht genau ersichtlich ist.- Bearbeitet Richard Klingler Donnerstag, 16. April 2015 19:13
- Als Antwort vorgeschlagen Stefan FalzModerator Donnerstag, 16. April 2015 22:17
- Als Antwort markiert Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 24. April 2015 08:42
-
Hallo. Vielen Dank!!! für eure Tipps, ich habe es wohl am Anfang nicht deutlich gesagt, ich werte
die Tabelle VERKAUF aus. Ich hole mir nur aus ARTIKEL das Feld ARTIKEL.Name weil die User
den Inhalt in der Tabelle VERKAUF für ihre Belegerfassung im Feld Name "verschönert" haben.Das Ziel ist nun:
select artikel.artikelid, artikel.name, sum(verkauf.menge) as menge, sum(verkauf.gewicht * verkauf.menge) as gewicht from artikel, verkauf where artikel.artikelid = verkauf.artikelid group by artikel.artikelid, artikel.name
Das Problem war, ich habe verkauf. statt artikel. verwendet weil ich immer auf
die Auswertung der Verkaufsdaten fixiert war. Manchmal sieht man den Wald
vor Bäumen nicht. Deshalb das Problem mit dem "Ausdruck ist nicht Teil der Aggregatfunktion".*gelöst
-
Hallo Rolf
Freut mich, dass Dir geholfen wurde....und ich meinen Senf los werden konnte (o;
Ich kenne mich halt mit MSSQL gar nicht aus, deshalb meine Antwort auf Postgresql bezogen. Für mich die letzte gute Opensource DB, seit Oracle MySQL einverleibt hat (o;
Keine Ahnung, ob MSSQL auch in meinem bestelltem Action Pack beinhaltet ist...aber wäre interessant, auch das mal auszuprobieren...
-
Hallo Richard,
SQL Server gibt es auch als kostenlose Express Edition.
https://www.microsoft.com/de-de/download/details.aspx?id=42299
Ich würde entweder:
ExpressAndTools 64BIT\SQLEXPRWT_x64_DEU.exe
oder
ExpressAdv 64BIT\SQLEXPRADV_x64_DEU.exe
nehmen. In beiden ist das Management Studio gleich mit enthalten.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community