Datensätze einer Spalte summieren und Einheit anhängen

CopWorker

Benutzer
Beiträge
24
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
 
Werbung:
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.
 
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'
 
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
 
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.
 
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
 
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
 
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
 
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
 
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.
 
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
 
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
 
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=*#
 
Werbung:
Zurück
Oben