Hallo, ich hab mal wieder eine Frage
Ich möchte diese Datum Darstellung Thu Mar 29 2018 21:50:59 GMT+0200 (Mitteleuropäische Sommerzeit)
in dieses Format ändern 2019-08-10 15:54:15.301+00
ist das möglich und wenn ja wie
Besten Dank vorab
Hallo, ich hab mal wieder eine Frage
Ich möchte diese Datum Darstellung Thu Mar 29 2018 21:50:59 GMT+0200 (Mitteleuropäische Sommerzeit)
in dieses Format ändern 2019-08-10 15:54:15.301+00
ist das möglich und wenn ja wie
Besten Dank vorab
Ich komme mit den Seiten nur schlecht zurecht, habs dann aber in meinen älteren sql Scripts gefunden
Trotzdem Danke!!
Mein nächstes Problem
habe eine Tabelle, stark vereinfacht
und möchte darstellen wie oft kommt jedes Ergebnis pro AuftragsNr vor
AuftragNr|Ergebnis|
100 | 10 |
100 | 10 |
100 | 10 |
100 | 9 |
100 | 8 |
200 | 10 |
200 | 1 |
200 | 7 |
200 | 7 |
Aussehen sollte es so
AuftragsNr| 10 | 9 | 8 | 7 | 1 |
100 | 3 | 1 | 1 |
200 | 1 | | | 2 |
habs mit crosstab versucht komme aber zu keinem Ergebnis
aber für die Spezialisten hier sicher kein Problem
besten Dank für jede Hilfe oder Anregung
gruß simar
Mal für Ergebniss von 10 bis 7, die Erweiterung ab 6 bis 1 überlasse ich Dir zur Übung:
test=*# select * from simar ;
nr | erg
-----+-----
100 | 10
100 | 10
100 | 10
100 | 9
100 | 8
200 | 10
200 | 1
200 | 7
200 | 7
(9 rows)
test=*# select nr, sum(case when erg = 10 then 1 else 0 end) as "10", sum(case when erg = 9 then 1 else 0 end) as "9", sum(case when erg = 8 then 1 else 0 end) as "8", sum(case when erg = 7 then 1 else 0 end) as "7" from simar group by nr;
nr | 10 | 9 | 8 | 7
-----+----+---+---+---
200 | 1 | 0 | 0 | 2
100 | 3 | 1 | 1 | 0
(2 rows)
test=*#
Danke Dir, bei der Steilvorlage kein Problem, funktioniert.
Zusatzfrage besteht die Möglichkeit die Werte der Spalte “erg” in die Zeile " nr | 10 | 9 | 8 | 7 " als Spaltenname zu übernehmen nachdem ich sie vorher gezählt wurden
test=*# select * from simar ;
nr | erg
-----±----
100 | 10
100 | 10
100 | 10
100 | 9
100 | 8
200 | 10
200 | 1
200 | 7
200 | 7
Hä?
ich meinte dass der select ohne , as “10”, as “9” ,vorgaben auskommt,
sondern direkt den gefundenen Wert ( 10; 9; 8; 7; 1; )als Spaltennamen übernimmt
wird aber nicht funktionieren.
Im Prinzip ginge das auch, dazu müßte man aber das SQL-Statement dynamisch erstellen und ausführen.
https://www.postgresql.org/docs/11/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN
dachte man könnte das Suchergebnis einfach um 90 Grad drehen mittels crosstab oder array_to_string()
aber das ist leider zu hoch für mich
Wenn es irgendwie geht, sollte man pivot/crosstab grundsätzlich in der Anwendung machen, die die Daten anzeigt. Das ist wesentlich leichter und flexibler (und macht auch das SQL deutlich einfacher).
Wenn es wirklich mal sein muss, dass man mehrere Zeilen zu Spalten transponieren muss, gehe ich eigentlich mehr und mehr dazu über, die dynamischen “Spalten” in eine JSON Spalte zu aggregieren. In den meisten Fällen ist das fast genauso gut, und deutlich einfacher zu verwenden - und es ist vollständig “dynamisch”. Wenn neue Werte für die “Spalten” hinzukommen passiert das automatisch, ohne dass man das Statement ändern müsste.
Z.b. so wie hier beschrieben: https://blog.sql-workbench.eu/post/pivot-alternatives/
hört sich gut an, aaaaber mir zu schwierig
Dann mach’s in der Anwendung wenn Du die Daten anzeigst.
wie meinst du das?
das ist meine Anzeige aus Abfrage
nr | erg | wie oft
-----±----
100 | 10 | 3
100 | 9 | 1
100 | 8 | 1
200 | 10 | 1
200 | 1 | 1
200 | 7 | 2
Du meinst ein Pivot? Mit crosstab sollte das gehen, ist aber IMHO recht umständlich. Wie wird das am Ende denn dargestellt? Ich mache solche Darstellungen meist im jeweiligen Client.
Gruß Uwe
crosstab wurde ja eigentlich schon genannt (sogar vom TE).
Es ist halt wie ebenfalls genannt nicht dynamisch, was problematisch ist.
Wenn, dann könnte im Fall hier nur die Variante mit 2 Selects, eins für Daten, eins für Header genommen werden.
Ein Select für Header ergibt aber dynamische Ergebnisse, außer man sorgt absichtlich dafür, dass das Headerstatement ein statisches Ergebnis hat. Hier vielleicht mit generate series 1-10 oder sowas.