none
group by nicht alle Spalten RRS feed

  • 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            5

    Es sollte aber dieses Ergebnis sein:

    Artikelnummer / Artikelname / Menge / Gewicht
    123456              Artikel1          3            8
    123789              Artikel2          2            5

    Ich 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.Artikelnummer

    aber wieder hat mich die Aggregatfunktion eingeholt.
    Hat jemand die passende Lösung?

    Gruss Rolf

    Donnerstag, 16. April 2015 14:47

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

    Donnerstag, 16. April 2015 18:49
    Moderator
  • 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.
    Donnerstag, 16. April 2015 19:12

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

    Donnerstag, 16. April 2015 15:46
    Moderator
  • 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....
    Donnerstag, 16. April 2015 18:24
  • 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

    Donnerstag, 16. April 2015 18:44
    Moderator
  • 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

    Donnerstag, 16. April 2015 18:49
    Moderator
  • 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.
    Donnerstag, 16. April 2015 19:12
  • 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

    Donnerstag, 16. April 2015 22:11
  • 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...

    Donnerstag, 16. April 2015 22:18
  • 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

    Donnerstag, 16. April 2015 23:31
    Moderator