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

Datensätze einer Spalte summieren und Einheit anhängen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von CopWorker, 6 November 2019.

  1. CopWorker

    CopWorker Benutzer

    Hallo zusammen,

    bin gerade dabei aus einer Datenbank Tabelle die Werte aus einer Spalte zu summieren und auf 2 Stellen nach dem Komma zu runden in Abhängigkeit eines anderen Spaltenwertes.
    Das funktioniert, ist ja auch nicht so schwer.

    Jetzt möchte ich aber an das jeweilige Ergebnis die Maßeinheit als Text mit anhängen.
    Im Ergebnis habe ich den gewünschten Text 'rot' markiert.

    Meine Abfrage lautet:
    Code:
    SELECT
        mat.MatCode, mat.MatName,
        round(sum(matverb.VerbrGewAuto),2) as VerbrGewAuto,
        round(sum(matverb.VerbrGewHand),2) as VerbrGewHand
    
    FROM mat, matverb 
    
    
    WHERE (mat.MatCode = matverb.MatCode
                    and
                    (matverb.ProdLinCode = 'M1')
                     and
                    (matverb.SchichtCode = 'Schicht A')
                   )
    
    GROUP BY mat.MatCode, mat.MatName
    
    Das Ergebnis:
    MatCode MatName VerbrGewAuto VerbrGewHand
    51000006 VESTOLIT P1982K 59.0 kg 0.0 kg
    51000014 VINNOLIT S3268P 203.9 kg 0.0 kg
    51001143 VYNOVA S 6830 2437693.54 kg 0.0 kg
    51001609 PRECARB 400 508528.15 kg 111.62 kg
    51002001 SOLVIN 267 RC 653461.41 kg 0.0 kg


    Vielen Dank für eure Hilfe im Voraus.

    Grüßen von CopWorker
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Deine Summe ist ein numerischer Wert, die Einheit Text. Um an einen numerischen Wert Text anzufügen mußt Du den Wert nach Text casten. Kurzdemo:

    Code:
    test=# select pi();
            pi       
    ------------------
     3.14159265358979
    (1 row)
    
    test=*# select pi()::text || ' kg';
          ?column?       
    ---------------------
     3.14159265358979 kg
    (1 row)
    
    test=*#
    
    Das war jetzt mit PostgreSQL, in M$SQL geht das casten etwas anders - siehe Handbuch.
     
  3. ukulele

    ukulele Datenbank-Guru

    Liegen denn alle summierten Werte immer in kg vor oder gibt es Unterschiede?

    In MSSQL wäre das
    Code:
    convert(VARCHAR(20),round(sum(matverb.VerbrGewAuto),2) as VerbrGewAuto) + ' kg'
     
  4. CopWorker

    CopWorker Benutzer

    Hallo ukulele,

    vielen Dank.
    Hab´s ein bisschen umgestaltet, läuft prima. auch auf SyBase Datenbank.
    convert(varchar(20), round(sum(matverb.VerbrGewAuto),2)) + ' kg' as VerbrGewAuto

    Kennst du dich auch mit SyBase Abfragen aus, insbesondere
    SQL Server Report Services (SSRS) auf SyBase Datenbank?

    Brauche dringen Hilfe in Sachen Dataseteigenschaften und Abfrageparameter.

    Grüße von CopWorker
     
  5. ukulele

    ukulele Datenbank-Guru

    Mit SyBase überhaupt nicht. Die Query's sind eventuell sehr ähnlich zu MSSQL, alles andere ist mir kein Begriff. Vielleicht jemand anders hier im Forum aber aktive gibt es nicht so viele.
     
  6. CopWorker

    CopWorker Benutzer

    Hallo ukulele,

    passt schon.
    Hab´s jetzt so gemacht mit der Konvertierung und Maßeinheit.

    replace(STR(sum(matverb.VerbrGewAuto), 25, 2), '.', ',') + ' kg' as VerbrGewAuto


    Grüßen von CopWorker
     
  7. CopWorker

    CopWorker Benutzer

    Hallo,
    ich brauch noch mal Hilfe.

    Wie im ersten Beitrag erwähnt,
    bin gerade dabei aus einer Datenbank Tabelle die Werte aus einer Spalte zu summieren und auf 2 Stellen nach dem Komma zu runden in Abhängigkeit eines anderen Spaltenwertes.

    Jetzt möchte ich die Summe aller Einzelsummen bilden und diese auf die entsprechende Spalte legen.

    Code:
    SELECT
       mat.MatCode, mat.MatName,
       round(sum(matverb.VerbrGewAuto),2) as VerbrGewAuto,
       round(sum(matverb.VerbrGewHand),2) as VerbrGewHand
    
    FROM mat, matverb
    
    
    WHERE (mat.MatCode = matverb.MatCode
                   and
                   (matverb.ProdLinCode = 'M1')
                    and
                   (matverb.SchichtCode = 'Schicht A')
                  )
    
    GROUP BY mat.MatCode, mat.MatName
    
    union all
    select sum(VerbrGewAuto) as VerbrGewAuto

    Geht da überhaupt?

    Grüße von CopWorker
     
  8. ukulele

    ukulele Datenbank-Guru

    Also mit UNION ALL kannst du weitere Zeilen anhängen, unter anderem auch summierte Zeilen. Alle Querys müssen aber die selbe Anzahl an Spalten haben (und die Spalten das selbe Format), versuch mal:
    Code:
    union all
    select 'Summe',NULL,sum(VerbrGewAuto),NULL
     
  9. akretschmer

    akretschmer Datenbank-Guru

    ich werfe mal den Begriff "Grouping Set" in den Raum.
     
  10. CopWorker

    CopWorker Benutzer

    Hallo ukulele,

    so habe ich das jetzt gemacht. Geht.
    union all
    select 'Summe' as 'MatCode ', '' as 'MatName', sum(VerbrGewAuto) as 'VerbrGewAuto ', '' as 'VerbrGewHand'

    Jetzt kommt aber das Problem.
    Egal wie die "WHERE" Klauses gestaltet ist, es werden alle Werte aus der Spalte miteinander addiert.
    Ich möchte aber dass nur die Werte aus dem Ergebnis einer Spalte miteinander addiert werden.
    Code:
    SELECT
       mat.MatCode, mat.MatName,
       round(sum(matverb.VerbrGewAuto),2) as VerbrGewAuto,
       round(sum(matverb.VerbrGewHand),2) as VerbrGewHand
    
    FROM mat, matverb
    
    
    WHERE (mat.MatCode = matverb.MatCode
                   and
                   (matverb.ProdLinCode = 'M1')
                    and
                   (matverb.SchichtCode = 'Schicht A')
                  )
    
    GROUP BY mat.MatCode, mat.MatName
    
    union all
    select 'Summe' as 'MatCode ', '' as 'MatName', sum(VerbrGewAuto) as 'VerbrGewAuto ', '' as 'VerbrGewHand'
    
    Geht da überhaupt?
    Es kommt `ne Fehlermeldung: "Meldung 207, Ebene 16, Status 1, Zeile 22 Ungültiger Spaltenname 'VerbrGewAuto'."
    Wie definiere ich ob ich auf den Spaltenname der Datenbanktabelle oder auf auf den Spaltenname des Ergebnissen zugreifen will?

    Vielen Dank in Voraus.
    Grüße von CopWorker
     
  11. akretschmer

    akretschmer Datenbank-Guru

    ich werfe erneut GROUPING SETS in den Raum, dazu ein kleines Beispiel:

    Code:
        brand VARCHAR NOT NULL,
        segment VARCHAR NOT NULL,
        quantity INT NOT NULL,
        PRIMARY KEY (brand, segment)
    );
    
    INSERT INTO sales (brand, segment, quantity)
    VALUES
        ('ABC', 'Premium', 100),
        ('ABC', 'Basic', 200),
        ('XYZ', 'Premium', 100),
        ('XYZ', 'Basic', 300);
    
    --
    -- nun mal die Lösung mit UNION ALL
    --
    test=*# SELECT
    test-#     brand,
    test-#     segment,
    test-#     SUM (quantity)
    test-# FROM
    test-#     sales
    test-# GROUP BY
    test-#     brand,
    test-#     segment
    test-#
    test-# UNION ALL
    test-#
    test-# SELECT
    test-#     brand,
    test-#     NULL,
    test-#     SUM (quantity)
    test-# FROM
    test-#     sales
    test-# GROUP BY
    test-#     brand
    test-#
    test-# UNION ALL
    test-#
    test-# SELECT
    test-#     NULL,
    test-#     segment,
    test-#     SUM (quantity)
    test-# FROM
    test-#     sales
    test-# GROUP BY
    test-#     segment
    test-#
    test-# UNION ALL
    test-#
    test-# SELECT
    test-#     NULL,
    test-#     NULL,
    test-#     SUM (quantity)
    test-# FROM
    test-#     sales;
     brand | segment | sum
    -------+---------+-----
     XYZ   | Basic   | 300
     ABC   | Premium | 100
     ABC   | Basic   | 200
     XYZ   | Premium | 100
     ABC   |         | 300
     XYZ   |         | 400
           | Basic   | 500
           | Premium | 200
           |         | 700
    (9 rows)
    
    --
    -- einfacher mit Grouping Sets
    --
    test=*# SELECT
    test-#     brand,
    test-#     segment,
    test-#     SUM (quantity)
    test-# FROM
    test-#     sales
    test-# GROUP BY
    test-#     GROUPING SETS (
    test(#         (brand, segment),
    test(#         (brand),
    test(#         (segment),
    test(#         ()
    test(#     );
     brand | segment | sum
    -------+---------+-----
           |         | 700
     XYZ   | Basic   | 300
     ABC   | Premium | 100
     ABC   | Basic   | 200
     XYZ   | Premium | 100
     ABC   |         | 300
     XYZ   |         | 400
           | Basic   | 500
           | Premium | 200
    (9 rows)
    
    Ich denke mal, das kannst Du auf Dein Problem übertragen. Grouping Sets sind soweit ich weiß auch in M$SQL implementiert.
     
  12. CopWorker

    CopWorker Benutzer

    Hallo akretschmer,

    Lokale Variable, das war mein erster Gedanke, da ich aus der C++ Welt komme.

    Alles gut und recht.
    Aber da es geht schon mal los, dass ich in SyBase keine lokalen Variablen generieren kann.
    "quantity INT NOT NULL"
    Warum weiß ich nicht, auf alle Fälle wird die Abfrage nicht ausgeführt weil in er Zeile
    in der die Variable deklariert ist anscheinend einen Fehler enthält.



    Vielen Dank.
    Grüße von CopWorker
     
  13. CopWorker

    CopWorker Benutzer

    Hallo akretschmer,

    und genau darin liegt mein Problem.
    test-# UNION ALL
    test-#
    test-# SELECT
    test-# brand,
    test-# NULL,
    test-# SUM (quantity)
    test-# FROM

    Der Zugriff auf "quantity" erfolgt auf die Werte der Tabellenspalte.
    So weit bin ich schon.
    Was ist wenn noch mehr Datensätze in der Tabelle sind.
    Code:
    INSERT INTO sales (brand, segment, quantity)
    VALUES
       ('ABC', 'Premium', 100),
       ('ABC', 'Basic', 200),
       ('XYZ', 'Premium', 100),
       ('XYZ', 'Basic', 300);
       ('UVP', 'Premium', 110),
       ('UVP', 'Basic', 310);
       ('UVP', 'Premium', 120),
       ('UVP', 'Basic', 320);
    und eine "WHERE" Klausel die UVP Einträge aus der Summierung ausschließt?

    Vielen Dank.
    Grüße von CopWorker
     
  14. akretschmer

    akretschmer Datenbank-Guru

    ich hab nur die zwei ersten mit UVP genommen, weil sonst der PK verletzt wäre.

    Code:
    test=*# select * from sales ;
     brand | segment | quantity
    -------+---------+----------
     ABC   | Premium |      100
     ABC   | Basic   |      200
     XYZ   | Premium |      100
     XYZ   | Basic   |      300
     UVP   | Premium |      110
     UVP   | Basic   |      310
    (6 rows)
    
    test=*# select brand, segment, sum(quantity) from sales where brand != 'UVP' group by grouping sets ((brand,segment),(brand),(segment),());
     brand | segment | sum
    -------+---------+-----
           |         | 700
     XYZ   | Basic   | 300
     ABC   | Premium | 100
     ABC   | Basic   | 200
     XYZ   | Premium | 100
     ABC   |         | 300
     XYZ   |         | 400
           | Basic   | 500
           | Premium | 200
    (9 rows)
    
    test=*#
    
     
    Walter gefällt das.
  15. CopWorker

    CopWorker Benutzer

    Hallo akretschmer,

    vielen Dank für den Tipp.
    Hat funktioniert.
    Es ist halt immer so, dass man sich an etwas gewöhnen sollte.

    Grüße von
    CopWorker
     
    akretschmer gefällt das.
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