Daten in eine Zeile zusammenfassen

simar

Neuer Benutzer
Beiträge
4
Hallo zusammen, als erstes wünsche ich ein gutes neues Jahr an alle.
Mein Anliegen,
ich habe eine PostgreSQL Tabelle mit immer 30 Datensätzen mit Zahlenwerten pro Vorgang. Mittels SQL Abfrage bekomme ich 3 Datensätze mit Summen aus den Zeilen 1-10 = 100
11-20 =120
21-30 =150
Kann man diese Abfrage erweitern dass das Ergebnis nicht untereinander
sondern in einer Zeile ausgegeben 100 | 120 | 150 wird?
 
Werbung:
ja, kann man, das ist möglich via einem Union,
wichtig ist dabei, dass die Spalten den selben Datentyp haben.

Beispiel:
Code:
select 1
union
select 2;

Resultat:
Code:
1
2

:D
 
Code:
select table1.column1 from table 1
union
select table2.column1 from table 2

erzähl mir ein wenig mehr, was du tun willst, aus dem Context oben kann man nur kaum Informationen erahnen.

Hier ein evtl. hilfreiches Beispiel:
Code:
select sum(a.generate_series+b.generate_series) from (select generate_series from generate_series(1, 10)) as a, (select generate_series from generate_series(1, 10)) as b;

er bildet die Summe aus 1 bis 10, 10 mal
 
Zuletzt bearbeitet:
Wenn Du die drei Zeilen irgendwie identifizieren kannst, dann geht es in etwa so:

Code:
with base_query as (
   ... hier kommt die ursprüngliche Abfrage
)
select r1.summe  as summe_1, r2.summe as summe_2, r3.summe as summe_3
from base_query as r1
  join base_query r2 on r2.zeilen_nr = 2
  join base_query r3 on r3.zeilen_nr = 3
where r1.zeilen_nr = 1

summe ist die Spalte die Deine Summe enthält und die Spalte zeilen_nr muss einen Wert enthalten mit dem Du die drei Zeilen eindeutig unterscheiden kannst.
 
die untere Abfrage bringt folgendes Ergebnis
id_training sum_zehntel
11018 105,5
11018 105,0
11018 106,2

ich möchte haben diese Dartellung
11018 105,5 | 105,0 | 106,2

könnt ihr mir dabei helfen?

SELECT
tmp1.id_training,

-- tmp1.schuetzen_name,
--array_to_string(array_agg(ergebnis_zehntel order by id_shot,serie),' | ')as einzelschüsse,
sum(tmp1.ergebnis_zehntel) AS sum_zehntel

-- count(1) AS anzahl_schuss
FROM ( SELECT (row_number() OVER (PARTITION BY t.id_training, t.id_schuss_typ ORDER BY t.id_shot) - 1) / 10 + 1 AS serie,
t.id_shot,
t.ergebnis_zehntel,
t.id_training,
t.id_schuss_typ,
t.id_schuetze,
s.schuetzen_name

FROM
t_transfer_rci_shot_h t,
t_schuetzen s
WHERE

t.id_schuetze = s.id_schuetzen and t.id_training =11018
and s.schuetzen_name ilike 'Sim%'

and t.id_schuss_typ = 2
) tmp1
 
Irgendwie fehlt da noch ein GROUP BY damit die Abfrage korrekt ist. Mir ist unklar wie da drei Zeilen kommen können, wenn kein GROUP BY verwendet wird, um die "zehntel" zu Summieren.
 
Angenommen serie liefert werden von 1 bis 3, dann sollte das folgende eigentlich funktionieren:

Code:
with data as (
  SELECT tmp1.serie,
         tmp1.id_training,
         sum(tmp1.ergebnis_zehntel) AS sum_zehntel
  FROM (
    select (row_number() OVER (PARTITION BY t.id_training, t.id_schuss_typ ORDER BY t.id_shot) - 1) / 10 + 1 AS serie,
           t.id_shot,
           t.ergebnis_zehntel,
           t.id_training,
           t.id_schuss_typ,
           t.id_schuetze,
           s.schuetzen_name
  FROM t_transfer_rci_shot_h t
    JOIN t_schuetzen s ON t.id_schuetze = s.id_schuetzen
  WHERE t.id_training = 11018
    and s.schuetzen_name ilike 'Sim%'
    and t.id_schuss_typ = 2
  ) tmp1
  GROUP BY tmp1.serie, tmp1.id_training, tmp1.id_schuss_typ
)
select s1.sum_zehntel as summe_1, s2.sum_zehntel as summe_2, s3.sum_zehntel as summe_3
from data as s1
  join data as s2 on s2.serie = 2
  join data as s3 on s3.serie = 3
where s1.serie = 1;

P.S.: count(1) ist im Übrigen sogar etwas langsamer als count(*) - zumindest in Postgres. Aber es gibt nicht ein einzige Datenbank in der count(1) jemals schneller gewesen wäre.
 
UNION ist hier der falsche Weg, damit bekommt man immer mehr Zeilen, nicht mehr Spalten. JOIN ist ein guter Weg, wie @castorp schon vorgeschlagen hat. Wichtig ist, dass es immer bei der selben Anzahl an Spalten bleibt. Wenn das irgendwann aus welchen Gründen auch immer mal mehr werden, sollte man anders vorgehen.

P.S.: count(1) ist im Übrigen sogar etwas langsamer als count(*) - zumindest in Postgres. Aber es gibt nicht ein einzige Datenbank in der count(1) jemals schneller gewesen wäre.
...und sum(1)? :)
 
Werbung:
Ist vermutlich auch langsamer. Der Grund dafür ist, dass Postgres (zumindest bis einschließlich Version 18) für jede Zeile das Argument der count Funktion geprüft hat, ob es NULL ist (da die Zeilen ja nicht mitgezählt werden). Es gab nur eine Optimierung für * bei der diese Prüfung nicht gemacht wurde. Deswegen ist count(1) langsamer als count(*).

Hier wurde das mal ganz gut beschrieben

Wenn ich das richtig gesehen habe, wird sich das wohl mit Postgres 19 ändern.
 
Zurück
Oben