PL/SQL - Summen von Spalten in Abfrage

MarcoVreden

Benutzer
Beiträge
11
Hallo Ihr Lieben,

ich versuche bisher vergeblich eine Summe unter meine Abfrage zu bekommen.

Bei diesem Beispiel, brauche ich eine Summenzeile unter den Artikeln:

select arnr, sum(VKWERT) from t096stat group by arnr

Artikel A 5000 Euro
Artikel B 3000 Euro
Artikel C 1000 Euro
SUMME 9000 Euro (diese letzte Zeile bekomme ich nicht hin.)

Kennt jemand die Lösung für mein Problem. Bin leider noch Anfänger und würde gerne mehr lernen :)

Vielen DANK
 
Werbung:
einfachste Lösung:

Code:
test=# create table marco_vreden(artikel text, betrag int);
CREATE TABLE
test=*# copy marco_vreden from stdin;
Geben Sie die zu kopierenden Daten ein, gefolgt von einem Zeilenende.
Beenden Sie mit einem Backslash und einem Punkt alleine auf einer Zeile, oder einem EOF-Signal.
>> a   5000
>> b   3000
>> c   1000
>> \.
COPY 3
test=*#
test=*#
test=*# select artikel, betrag from marco_vreden union all select 'Summe',sum(betrag) from marco_vreden ;
 artikel | betrag
---------+--------
 a       |   5000
 b       |   3000
 c       |   1000
 Summe   |   9000
(4 Zeilen)

test=*#

Kaffee!
 
andere Lösung:

Code:
test=*# select artikel, sum(betrag) from marco_vreden group by rollup(artikel);
 artikel | sum  
---------+------
 a       | 5000
 b       | 3000
 c       | 1000
         | 9000
(4 Zeilen)
 
Vielen Dank für die superschnelle Antwort.

einfachste Lösung:

Code:
test=*# select artikel, betrag from marco_vreden union all select 'Summe',sum(betrag) from marco_vreden ;
 artikel | betrag
---------+--------
 a       |   5000
 b       |   3000
 c       |   1000
 Summe   |   9000
(4 Zeilen)

das funktioniert bei mir leider nicht, vermutlich weil die Beträge bereits summierte Werte sind? Jedenfalls bekomme ich bei Abfrage auf einen Artikel viele Zeilen. Hier sollte er nur eine Zeile summiert anzeigen je Artikel und dann die Summe darunter.

Die Abfrage mit dem Rollup funktioniert, solange wie ich auf eine Spalte gruppiere. Wenn ich auf zwei Spalten gruppiere, dann bringt sie mir je Artikel eine Summe. Aber schon mal nah an meinem Wunsch dran. :)

Das ist die komplette Abfrage... vielleicht wird es dann deutlicher.
select arnr,
arbe,
count(ARNR) Positionen,
sum(menge) Menge,
sum(ekwert) EK,
sum(vkwert) VK,
sum(vkwert-ekwert) Rohertrag
from tabelle
where reda between '01.06.2018' and '30.06.2018'
and arnr in ('FRACHT','KRAN','GURT','PLAN')
and sart = 'V'
group by (arnr, arbe)
 
was gefällt Dir besser?

Code:
test=*# select * from marco_vreden ;
 artikel | betrag
---------+--------
 a       |   5000
 b       |   3000
 c       |   1000
 a       |    100
 b       |    200
 c       |    300
(6 Zeilen)

test=*# select *, sum(betrag) over (partition by artikel) from marco_vreden ;
 artikel | betrag | sum  
---------+--------+------
 a       |   5000 | 5100
 a       |    100 | 5100
 b       |   3000 | 3200
 b       |    200 | 3200
 c       |   1000 | 1300
 c       |    300 | 1300
(6 Zeilen)

test=*# select artikel, betrag from marco_vreden union all select 'Summe ' || artikel, sum(betrag) from marco_vreden group by 1 order by 1;
 artikel | betrag
---------+--------
 a       |   5000
 a       |    100
 b       |    200
 b       |   3000
 c       |   1000
 c       |    300
 Summe a |   5100
 Summe b |   3200
 Summe c |   1300
(9 Zeilen)

test=*#
 
wieder was gelernt, daher schon mal gut! :) Die zweite Abfrage bekomme ich auf meiner Datenbank nicht hin.... da meckert er ORA-00979: Kein GROUP BY-Ausdruck

Aber ich wollte nicht die Summe je Artikel (die habe ich ja schon durch SUM(Artikel) - sondern ich wollten "nur" die Summe unter der Betrag-Spalte - im Beispiel also 9600 Euro.
 
also wie nun?

Code:
test=*# select artikel, betrag from marco_vreden union all select 'Summe gesamt', sum(betrag) from marco_vreden ;
   artikel    | betrag
--------------+--------
 a            |   5000
 b            |   3000
 c            |   1000
 a            |    100
 b            |    200
 c            |    300
 Summe gesamt |   9600
(7 Zeilen)

test=*#

so?
 
nein, so nicht... es sollte so aussehen:

artikel | betrag
-------------------+--------
a | 5100
b | 3200
c | 1300
Summe gesamt | 9600
(4 Zeilen)

Also je Artikel nur ein Zeile mit der Summe für diesen Artikel UND zusätzlich unten die Summe aller Artikel.
 
ist doch im Prinzip schon gezeigt, einfach mal kreativ sein ...

Code:
test=*# (select artikel, sum(betrag) from marco_vreden group by artikel order by artikel) union all select 'Summe gesamt', sum(betrag) from marco_vreden ;
   artikel    | sum  
--------------+------
 a            | 5100
 b            | 3200
 c            | 1300
 Summe gesamt | 9600
(4 Zeilen)

test=*#
 
einfach mal kreativ sein ...
Der Spruch passt zu deinem Avatar-Bild :D

Vielen DANK für Deine Geduld mit mir. :)

Was noch nicht funktioniert:
Auf mehr als nur die Artikelnummer zu gruppieren. Ich würde gerne die Artikelbeschreibung mit auswerten. Warum sagt er dann, ORA-01789: Abfrageblock hat falsche Anzahl an Ergebnisspalten
Ein Count(Artikel) kann ich in dieser Abfrage wohl nicht mit auswerten, da nicht summierbar, oder?
 
Code:
test=# select * from marco_vreden ;
 artikel | betrag
---------+--------
 a       |   5000
 b       |   3000
 c       |   1000
 a       |    100
 b       |    200
 c       |    300
(6 Zeilen)

test=*# alter table marco_vreden add column artikel_text text;
ALTER TABLE
test=*# update marco_vreden set artikel_text = 'Artikel ' || artikel;
UPDATE 6
test=*# (select artikel, artikel_text, sum(betrag) from marco_vreden group by artikel, artikel_text order by artikel) union all select 'Summe gesamt','',sum(betrag) from marco_vreden ;
   artikel    | artikel_text | sum  
--------------+--------------+------
 a            | Artikel a    | 5100
 b            | Artikel b    | 3200
 c            | Artikel c    | 1300
 Summe gesamt |              | 9600
(4 Zeilen)

test=*#

versuche einfach mal die Prinzipien zu verstehen ;-)
 
Werbung:
ja, ja einfach mal... :rolleyes:
Ich gebe mein Bestes... das es so einfach mit ' ' zu lösen ist, da bin ich nicht drauf gekommen - aber ich lerne immer noch gerne ;).
VIELEN DANK für deine Zeit. :)
 
Zurück
Oben