Gruppierung nach Teilstring einer Spalte

Hab da wieder mal ne Frage :slight_smile:
Ich habe eine Tabelle in der Zeiten pro Projekt gespeichert sind. Nun gibt es bei den Projektnummern
gewisse Gruppen, gekennzeichnet durch gewisse Ziffern o.ä., z.B.:

Gruppe allg: gekennzeichnet durch die 0 an 2.3. und 4.Stelle:
6000A1
6000B4

Prozessnumemr geklennzeichnet durch das P an 2. Stelle:
6P01E5
6P03ZZ

Management gekennzeichnet durch das M auf der zweiten Stelle:
6M0001

Hauptprojekte gekennzeichet durch Zahlen auf der 2., 3. und 4. Stelle (aber nicht 000)
6123A1
6244B5

Z-Projekte gekennzeichnet durch ein Z auf der 2. Stelle:

6Z0125
6Z02EE




Hab grade keine Ahnung ob das durch einen SQL zu machen ist.
Kann mir einer von euch weiter helfen.

Danke schon mal

Gruß
Andreas

Ich habe ja noch nicht mal eine Idee, was genau du machen willst. Du hast keine Frage gestellt :wink:

Ich weiß zwar nicht, was Du machen willst, aber es geht bestimmt!!!1elf.

Laut Glaskugel vielleicht aber sowas hier:

test=*# select * from projekte ;
   id   | wert
--------+------
 1a0001 |   10
 1a0002 |   20
 2b0003 |   11
(3 rows)

test=*# select substring(id,2,1), sum(wert) from projekte group by 1;
 substring | sum
-----------+-----
 b         |  11
 a         |  30
(2 rows)

Andreas

hmm lass mal sehen,
ich kann das leider nicht so schön darstellen wie ihr, aber im Grunde will ich folgendes:

Tabellen Inhalt
Priojekt: Stunden:
6000A1 12
6000B4 10
6P01E5 3
6P03ZZ 5
6M0001 2,5
6123A1 3
6244B5 5
6Z0125 4
6Z02EE 3

Jetzt hätt ich gern als Output die Summe der Stunden auf “Projektart”, also:

6000 22 --> Gruppierung auf Projekte die mit 6000 anfangen
6P 8 --> Gruppierung auf Projekte die mit 6P beginnen
6M 2,5 --> Gruppierung auf Projekte die mit 6M beginnen
6zzz 8 --> Gruppierung auf Projekte die mit 6 beginnen gefolgt von 3 Zahlen
6Z 7 --> Gruppierung auf Projekte die mit 6Z beginnen


Ich weiß nicht wie ich mich anders ausdrücken soll :slight_smile:
Geht sowas überhaupt über SQL??
Ist es einigermasen klar?

Danke

Gruß
Andreas

Das geht mit code-Tags, also eckige Klammer auf, code, Klammer zu. Beenden mit Klammer auf, , code, Klammer zu.

Tabellen Inhalt
Priojekt: Stunden:
6000A1 12
6000B4 10
6P01E5 3
6P03ZZ 5
6M0001 2,5
6123A1 3
6244B5 5
6Z0125 4
6Z02EE 3

Jetzt hätt ich gern als Output die Summe der Stunden auf “Projektart”, also:

6000 22 → Gruppierung auf Projekte die mit 6000 anfangen
6P 8 → Gruppierung auf Projekte die mit 6P beginnen
6M 2,5 → Gruppierung auf Projekte die mit 6M beginnen
6zzz 8 → Gruppierung auf Projekte die mit 6 beginnen gefolgt von 3 Zahlen
6Z 7 → Gruppierung auf Projekte die mit 6Z beginnen


Ich weiß nicht wie ich mich anders ausdrücken soll :slight_smile:
Geht sowas überhaupt über SQL??
Ist es einigermasen klar?

Danke

Gruß mal ein
Andreas

Ja. Deine Gruppe “6000” beginnt mit 6, gefolgt von 3 Ziffern. Das gilt auch für Deine Gruppe 6zzz (laut Beschreibung). Ansonsten mal dieser Ansatz:

test=*# select * from projekte ;
   id   | wert
--------+------
 6000A1 |   12
 6000B4 |   10
 6P01E5 |    3
 6P03ZZ |    5
 6M0001 |    2
 6123A1 |    3
 6244B5 |    5
 6Z0125 |    4
 6Z02EE |    3
(9 rows)

test=*# select sum(case when id ~ '^6000' then wert else 0 end) as "6000", sum(case when id ~'^6p' then wert else 0 end) as "6P", sum(case when id~'^6Z' then wert else 0 end) as "6Z" from projekte ;
 6000 | 6P | 6Z
------+----+----
   22 |  0 |  7
(1 row)

Andere Lösung: einzelne Selects, diese durch UNION zusammenkleben, fertig.

test=*# select '6000' as gruppe, sum(wert) from projekte where id ~'6000' group by 1 union  select '6P', sum(wert) from projekte where id ~'^6P' group by 1;
 gruppe | sum
--------+-----
 6000   |  22
 6P     |   8
(2 rows)

Wegens massiver faulheit hab ich das mal nur für 2-3 Guppen gemacht…


Andreas

wow, bin beeindruckt, komm heut leider nicht mehr zum testen.
Melde aber morgen gleich das Ergebnis :slight_smile:

Danke schon mal

Da ist natürlich ein Fipptehler drin im Code…


Andreas

Danke Andreas für die Antwort,
habe es versucht und es klappt echt schon super, bis auf den einen Fall:

es gibt Projekte die beginnen mit 6000 und andere die mit 6 gefolgt von drei Zahlen, die kleinste also 6001

Also bräucht ich für zum Beispiel:

6000A0     12
6000BD     5
6124A0     4
6244B3     3
600054     2

ouput sollte dann sowas sein:

6000       19
6xxx         7

hast du mir hierfür vielleicht noch ne Lösung? Kann man in SQL vielleicht reguläre Ausdrücke anweden oder so?

Wäre echt super.

Danke schon mal


Gruß
Andreas

Ja, PostgreSQL kann mit regulären Ausdrücken recht gut umgehen. Ich hoffe, diese Aussage ist nun endlich genug Anreiz, dies in der Doku mal nachzulesen.


Andreas

Hab die Doku gelesen, fündig wurd ich aber über RegEx.
Die Lösung schaut so aus:

sum(case when pgt_tbl_tprj.tpr_pze !~ ‘^6000’ and pgt_tbl_tprj.tpr_pze ~ ‘^6[0-9][0-9][0-9]’ then pgt_tbl_buchung.bng_zeit else 0 end)

Danke nochmal :slight_smile:

Gruß
Andreas