Zwischensummen erstellen

IchHH

Datenbank-Guru
Beiträge
284
Hallo,

ich bin es mal wieder mit einer für mich unlösbaren Aufgabe.

Ich versuche in einer Spalte Namens "Kontenarten" (es befinden sich 3 stellige Nummer darin) eine Spalte einzufügen die sich aus den ersten beiden Zahlen der Kontenart zusammen fügen und in der die Summe aller Werte aller nachfolgenden Spalten enthalten ist.

Das würde dann so aussen

Kontenart 09.07.2017 10.07.2017
400 10 25
401 12 9
402 -2 12
40 20 46
410 5 7
411 2 5
413 5 6
41 12 18
.
.
.

Ich wollte ursprünglich mit Rollup Arbeiten, dann mit Case When und SUM dann mit Group by aber immer habe ich das Problem das es sehr viele Spalten gibt die täglich um eine erweitert wird, weshalb ich diese nicht einzelnd aufzählen kann.

Hat dazu vielleicht jemand eine Idee?
 
Werbung:
Code:
test=*# select * from ich_hh ;
  k  | c09 | c10
-----+-----+-----
 400 |  10 |  25
 401 |  12 |  9
 402 |  -2 |  12
 410 |  5 |  7
 411 |  2 |  5
 413 |  5 |  6
(6 Zeilen)

test=*# insert into ich_hh select substring(k,1,2), sum(c09), sum(c10) from ich_hh group by 1;
INSERT 0 2
test=*# select * from ich_hh ;
  k  | c09 | c10
-----+-----+-----
 400 |  10 |  25
 401 |  12 |  9
 402 |  -2 |  12
 410 |  5 |  7
 411 |  2 |  5
 413 |  5 |  6
 41  |  12 |  18
 40  |  20 |  46
(8 Zeilen)

test=*#

Prinzipiell halte ich das für üblen Bullshit. Warum soll etwas, was berechenbar ist, nochmals eingefügt werden? Was passiert bei weiteren Updates oder Inserts oder Deletes? Eine View, die das darstellt, wäre intelligenter.

Code:
test=*# create view bessere_loesung as select substring(k,1,2), sum(c09) as s09, sum(c10) as s10 from ich_hh where length(k) = 3 group by 1;
CREATE VIEW
test=*# select * from bessere_loesung ;
 substring | s09 | s10
-----------+-----+-----
 40  |  20 |  46
 41  |  12 |  18
(2 Zeilen)

test=*#
 
Ähm, in wie fern hat mir das nun weitergeholfen? Wie berechnet man den so ein Spalte am besten bei einer Tabelle wo jede Spalte diese Zwischensumme benötigt?
 
Ähm, in wie fern hat mir das nun weitergeholfen?

Ist es nicht das, was du gesucht hast? Andere Lösung mit GROUPING SETS:

Code:
test=*# select * from ich_hh ;
 kontenart | 9.7.2017 | 10.7.2017
-----------+----------+-----------
 400  |  10 |  25
 401  |  12 |  9
 402  |  -2 |  12
 410  |  5 |  7
 411  |  2 |  5
 413  |  5 |  6
(6 Zeilen)

test=*# select kontenart, gruppe, sum("9.7.2017"), sum("10.7.2017") from (select kontenart, substring(kontenart,1,2) as gruppe, "9.7.2017", "10.7.2017" from ich_hh) foo group by grouping sets ((kontenart),(gruppe)) ;
 kontenart | gruppe | sum | sum
-----------+--------+-----+-----
 400  |  |  10 |  25
 401  |  |  12 |  9
 402  |  |  -2 |  12
 410  |  |  5 |  7
 411  |  |  2 |  5
 413  |  |  5 |  6
  | 40  |  20 |  46
  | 41  |  12 |  18
(8 Zeilen)

test=*#
 
Achso, ja genau.

Ich habe das versucht nun mal umzusetzen und das sieht wie folgt aus:

Code:
Declare @Spalten nvarchar(4000),
        @query nvarchar(4000)

Set @Spalten = 'SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = S_92660'
Set @query =

'Select Kontenart, gruppe, sum('''+ @Spalten +''') from
(Select Kontenart, substring(''' + @Spalten +''') as gruppe, '''+ @Spalten +''' from S_92660)
foo group by grouping sets ((Kontenart),(gruppe))'
Exec (@query)

Nun fordert SQL das die substring-Funktion 3 Argumente benötigt.

Ändere ich daraufhin den code auf:
Code:
Declare @Spalten nvarchar(4000),
        @query nvarchar(4000)

Set @Spalten = 'SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = S_92660'
Set @query =

'Select Kontenart, gruppe, sum('''+ @Spalten +''') from
(Select Kontenart, substring(kontenart,1,2) as gruppe, '''+ @Spalten +''' from S_92660)
foo group by grouping sets ((Kontenart),(gruppe))'
Exec (@query)

woraufhin nun der Fehler "Kein Spaltenname wurde für die Spalte 3 von 'foo' angegeben."

Irgendwie verstehe ich nicht warum keine Variablen genutzt werden können. Magst du mir das bitte einmal erklären?
 
Ja war ein dumme Frage. Jetzt wo du es sagst leuchtet es ein. Wie aber ich den Code gestallten müssten, damit ich mehrere Spalten auf diese Art berechnen lassen kann, ohne Manuell die Spalten anzugeben?
 
Werbung:
Zurück
Oben