# Summe der Werte eines generated column aus der union mehrerer SELECT-Abfragen berechnen?

**URL:** https://www.pg-forum.de/t/summe-der-werte-eines-generated-column-aus-der-union-mehrerer-select-abfragen-berechnen/12629
**Category:** SQL
**Created:** [15. November 2022 um 06:06 UTC](https://www.pg-forum.de/t/summe-der-werte-eines-generated-column-aus-der-union-mehrerer-select-abfragen-berechnen/12629 "2022-11-15T06:06:03Z")
**Posts on this page:** 8
**Page:** 1

<div class="post-metadata">

### Author: ![Infinarius](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/i/bc8723/32.png) [@Infinarius](https://www.pg-forum.de/u/Infinarius)
#### Post date: [15. November 2022 um 06:06 UTC](https://www.pg-forum.de/t/summe-der-werte-eines-generated-column-aus-der-union-mehrerer-select-abfragen-berechnen/12629/1 "2022-11-15T06:06:03Z")

</div>

Hallo allerseits,

mich würde interessieren, ob es möglich ist, in PostgreSQL die Summe eines generated columns zu berechnen, der durch eine UNION von 3 verschiedenen SELECT-Befehlen zustande gekommen ist. Genauer sieht die Situation wie folgt aus:

 ![SELECT-Befehle_Frage](https://www.pg-forum.de/uploads/default/original/1X/e758ac00c9c2d664a5cdcffa428d08f72f6ebde7.png)

Die 3 SELECT-Abfragen suchen aus derselben Tabelle (gears g) Daten nach unterschiedlichen Kriterien heraus.  
Neben der Spalte g.machine\_id soll ein generated column mit einer Aggregationsfunktion (SUM()) angezeigt werden.  
Die Werte sollen dabei nach g.machine\_id gruppiert werden.  
Die aggregated columns der 3 SELECT-Abfragen werden mit “workload\_one/two/three” betitelt.  
Als Ergebnis erhält man eine Tabelle mit zwei Spalten. Eine Spalte listet die herausgefilterten machine\_ids auf, und die andere Spalte listet die Ergebnisse der einzelnen SELECT-Abfragen auf. Soweit alles gut. Es ist zu sehen, dass machine\_id “1” zwei mal in der Spalte “machine\_id” auftaucht.

Die Frage ist nun, ob man die Werte des generated column “workload\_one”, den man unten im Output-Fenster sieht, auch nochmal summieren und auf die einzelnen machine\_ids gruppieren kann, sodass jede machine\_id nur einmal vorkommt, und die Summe der Ergebnisse aller SELECT-Abfragen für diese machine\_id enthält.

Über eine zeitnahe Antwort würde ich mich sehr freuen

Infinarius

---

<div class="post-metadata">

### Author: ![castorp](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/c/e99b99/32.png) [@castorp](https://www.pg-forum.de/u/castorp)
#### Post date: [15. November 2022 um 07:46 UTC](https://www.pg-forum.de/t/summe-der-werte-eines-generated-column-aus-der-union-mehrerer-select-abfragen-berechnen/12629/2 "2022-11-15T07:46:55Z")

</div>

Code als Screenshot ist eine [wirklich schlechte Idee](http://idownvotedbecau.se/imageofcode)

---

<div class="post-metadata">

### Author: ![akretschmer](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/a/a6a055/32.png) [@akretschmer](https://www.pg-forum.de/u/akretschmer)
#### Post date: [15. November 2022 um 08:07 UTC](https://www.pg-forum.de/t/summe-der-werte-eines-generated-column-aus-der-union-mehrerer-select-abfragen-berechnen/12629/3 "2022-11-15T08:07:51Z")

</div>

ich schließe mich @castorp an.

Vielleicht hilft das folgende, ich gebe mir jetzt nicht die Mühe Deine Bilder zu parsen…

```auto
postgres=# create table foo (id int generated always as identity primary key, val int);
CREATE TABLE
postgres=# insert into foo (val) select * from generate_series(1,10) s;
INSERT 0 10
postgres=# select sum(val) from foo where id < 5 union select sum(val) from foo where id > 5;
 sum 
-----
  10
  40
(2 rows)

postgres=# with x as (select sum(val) from foo where id < 5 union select sum(val) from foo where id > 5) select sum(sum) from x;
 sum 
-----
  50
(1 row)

postgres=# 
```

---

<div class="post-metadata">

### Author: ![Infinarius](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/i/bc8723/32.png) [@Infinarius](https://www.pg-forum.de/u/Infinarius)
#### Post date: [15. November 2022 um 16:24 UTC](https://www.pg-forum.de/t/summe-der-werte-eines-generated-column-aus-der-union-mehrerer-select-abfragen-berechnen/12629/4 "2022-11-15T16:24:29Z")

</div>

Tut mir leid. Hier:

SELECT g.machine\_id, (SUM(EXTRACT(EPOCH FROM g.end\_time) - EXTRACT(EPOCH FROM g.start\_time))/3600/720)\*100 AS workload\_one  
FROM gears g  
WHERE g.start\_time \> ‘2022-11-01 00:00:00’ AND g.end\_time \< ‘2022-12-01 00:00:00’  
GROUP BY g.machine\_id  
UNION  
SELECT g.machine\_id, (SUM(EXTRACT(EPOCH FROM g.end\_time) - EXTRACT(EPOCH FROM timestamptz ‘2022-11-01 00:00:00’))/3600/720)\*100 AS workload\_two  
FROM gears g  
WHERE g.start\_time \< ‘2022-11-01 00:00:00’ AND g.end\_time \> ‘2022-11-01 00:00:00’ AND g.end\_time \< ‘2022-12-01 00:00:00’  
GROUP BY g.machine\_id  
UNION  
SELECT g.machine\_id, (SUM(EXTRACT(EPOCH FROM timestamptz ‘2022-12-01 00:00:00’) - EXTRACT(EPOCH FROM g.start\_time))/3600/720)\*100 AS workload\_three  
FROM gears g  
WHERE g.end\_time \> ‘2022-12-01 00:00:00’ AND g.start\_time \> ‘2022-11-01 00:00:00’ AND g.start\_time \< ‘2022-12-01 00:00:00’  
GROUP BY g.machine\_id;

Danke schonmal für die Antwort!

---

<div class="post-metadata">

### Author: ![castorp](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/c/e99b99/32.png) [@castorp](https://www.pg-forum.de/u/castorp)
#### Post date: [15. November 2022 um 19:00 UTC](https://www.pg-forum.de/t/summe-der-werte-eines-generated-column-aus-der-union-mehrerer-select-abfragen-berechnen/12629/5 "2022-11-15T19:00:15Z")

</div>

Du kannst das gesamte UNION in eine sog. derived Table packen. Der Spaltenalias des Gesamtresultats wird übrigens durch die Spalten der **ersten** Abfrage der UNION definiert. Der Alias `as workload_two` hat also überhaupt keinen Effekt.

Das Umrechnen in Tage(?) kann man dann auch nur einmal am Ende machen:

```
select machine_id, 
       sum(workload) as workoad, 
       extract(epoch from sum(workload)/3600/720)*100 as workload_adjusted
from (
  SELECT g.machine_id, sum(g.end_time - g.start_time) as workload -- nur dieser Alias ist relevant!
  FROM gears g
  WHERE g.start_time > '2022-11-01 00:00:00' AND g.end_time < '2022-12-01 00:00:00'
  GROUP BY g.machine_id
  UNION
  SELECT g.machine_id, SUM(g.end_time - timestamptz '2022-11-01 00:00:00')
  FROM gears g
  WHERE g.start_time < '2022-11-01 00:00:00' AND g.end_time > '2022-11-01 00:00:00' AND g.end_time < '2022-12-01 00:00:00'
  GROUP BY g.machine_id
  UNION
  SELECT g.machine_id, SUM(timestamptz '2022-12-01 00:00:00' - g.start_time)
  FROM gears g
  WHERE g.end_time > '2022-12-01 00:00:00' AND g.start_time > '2022-11-01 00:00:00' AND g.start_time < '2022-12-01 00:00:00'
  GROUP BY g.machine_id
) t
group by machine_id

```

---

<div class="post-metadata">

### Author: ![Infinarius](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/i/bc8723/32.png) [@Infinarius](https://www.pg-forum.de/u/Infinarius)
#### Post date: [16. November 2022 um 15:38 UTC](https://www.pg-forum.de/t/summe-der-werte-eines-generated-column-aus-der-union-mehrerer-select-abfragen-berechnen/12629/6 "2022-11-16T15:38:53Z")

</div>

Ich habe eine Weile zum Nachvollziehen gebraucht, aber habe es nun verstanden, und es funktioniert genau so wie beabsichtigt. Vielen Dank für Hilfe! 🙂

---

<div class="post-metadata">

### Author: ![Infinarius](https://www.pg-forum.de/letter_avatar_proxy/v4/letter/i/bc8723/32.png) [@Infinarius](https://www.pg-forum.de/u/Infinarius)
#### Post date: [16. November 2022 um 15:42 UTC](https://www.pg-forum.de/t/summe-der-werte-eines-generated-column-aus-der-union-mehrerer-select-abfragen-berechnen/12629/7 "2022-11-16T15:42:34Z")

</div>

Vielen Dank für die Hilfestellung. Ich habe die Abfragen noch nicht ganz nachvollziehen können, aber habe bereits eine hinreichende Antwort erhalten. 🙂

---

<div class="post-metadata">

### Author: ![system](https://www.pg-forum.de/uploads/default/original/1X/dc97a981dd26692d5fb52e8b8fc7c090d7b9559a.png) [@system](https://www.pg-forum.de/u/system)
#### Post date: [15. Januar 2023 um 15:43 UTC](https://www.pg-forum.de/t/summe-der-werte-eines-generated-column-aus-der-union-mehrerer-select-abfragen-berechnen/12629/8 "2023-01-15T15:43:25Z")

</div>

Dieses Thema wurde automatisch 60 Tage nach der letzten Antwort geschlossen. Es sind keine neuen Antworten mehr erlaubt.
