Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Zwischensummen erstellen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von IchHH, 10 Juli 2017.

  1. IchHH

    IchHH Datenbank-Guru

    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?
     
  2. akretschmer

    akretschmer Datenbank-Guru

    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=*#
    
     
  3. IchHH

    IchHH Datenbank-Guru

    Ä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?
     
  4. akretschmer

    akretschmer Datenbank-Guru

    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=*#
    
     
  5. IchHH

    IchHH Datenbank-Guru

    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?
     
  6. akretschmer

    akretschmer Datenbank-Guru

    Jein. Ich würde, würde ich M$SQL kennen & verstehen, so nutze ich aber 'nur' Standard-SQL, wie es z.B. PostgreSQL kann.
     
  7. IchHH

    IchHH Datenbank-Guru

    Verstehe. Aber was bitte macht Foo bzw. wie funktioniert der foo code?
     
  8. akretschmer

    akretschmer Datenbank-Guru

    foo ist nur ein Alias für das Subselect. Dieses erstellt ja eine virtuelle Tabelle, der ich einen Namen geben MUß.
     
  9. IchHH

    IchHH Datenbank-Guru

    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?
     
  10. akretschmer

    akretschmer Datenbank-Guru

    wie viele Spalten hast du denn? Mir scheint, sehr viele. Mir scheint weiterhin, du machst da konzeptionell was falsch ...
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden