Eindeutige Werte und deren Anzahl

alexprivatBerlin

Neuer Benutzer
Beiträge
2
Hallo Wissende,

bitte nicht lachen aber ich habe meinen Horizont erreicht und komme nicht weiter. Ich möchte eine DB auswerten die nicht auf meinem Mist gewachsen ist. Dort gibt es ein Feld in dem 2 Personalnummern stehen. Diese habe ich in einer Abfrage mit LEN und CHARINDEX auf eine Personalnummer reduziert. Außerdem dies mit Datumsangabe und DISTINCT auf eine eindeutige Liste je Tag eingegrenzt. Nun möchte ich aber wissen wie oft die nun eindeutige Personalnummer in dieser Tabelle auftaucht. Und das dann für alle eindeutigen Werte.
Wie gesagt, die Liste der eindeutigen Personalnummern hätte ich als Unterabfrage schon fertig aber wie bekomme ich deren Anzahl geCOUNTet? Ich habe es schon mal mit CHARINDEX > 0 versucht aber da bekomme ich beim Suchtext ja keine Unterabfrage unter.

Ich hoffe ich habe das halbwegs gut beschrieben. Stehe in einer Sackgasse.
Danke
 
Werbung:
ein Beispiel, wie die Werte aussehen, und was rauskommen soll, wäre nicht schlecht. Generell suchst Du aber etwas mit COUNT() und GROUP BY.
 
Hallo akretschmer,

ich versuche das mal.
Tabelle:
Personal Datum Uhrzeit
10, 32 20.07.2020 06:00
13, 54 21.07.2020 05:30
10, 32 21.07.2020 06:00
13, 54 21.07.2020 06:15


gewünschtes Ergebnis:
Ps_Nr Anzahl
10 1
13 2
32 1
54 2

SQL bis hier:
select distinct(right(personal,len(personal)-CHARINDEX(',', personal)-1)) from DB.Tabelle
where Datum between
('21.07.2020') and ('22.07.2020')
Damit kann ich die erste Personalnummer extrahieren.
Sowas ähnliches habe ich für die zweite Personalnummer auch. Ich bekomme das jetzt aber nicht mit COUNT zusammengesteckt. Im Prinzip braucheich sowas wie:

select count(*) from (
select distinct(right(personal,len(personal)-CHARINDEX(',', personal)-1)) from DB.Tabelle
where Datum between
('21.07.2020') and ('22.07.2020'))
group by Personal
 
Werbung:
Daß da 2 Personalnummern einem Feld stehen ist großer Mist, weil das ein klarer Verstoß gegen sämtliche Grundregeln darstellt. Dazu kommt, daß es offenbar keinen Primary Key gibt.

Ich kann Dir hier eine Lösung mit PostgreSQL zeigen, unter Verwendung einer internen Systemspalte (ctid) und Einsatz von LATERAL JOIN und regexp_split_to_table(). Gibt sicherlich weitere Wege, aber ich würde an Deiner Stelle eine Website über Normalisierung auf Granitplatten ausdrucken und damit den Schuldigen prügeln.

Code:
test=*# select * from alex ;
 personal |   datum   
----------+------------
 10,32    | 2020-07-20
 13,54    | 2020-07-21
 10,32    | 2020-07-21
 13,54    | 2020-07-21
(4 rows)
test=*# with temp as (select a.datum , p.*from alex a left join lateral (select regexp_split_to_table(personal, ',') as personal from alex where a.ctid=alex.ctid) p on true) select datum, personal, count(personal) from temp group by datum, personal order by datum,personal;
   datum    | personal | count
------------+----------+-------
 2020-07-20 | 10       |     1
 2020-07-20 | 32       |     1
 2020-07-21 | 10       |     1
 2020-07-21 | 13       |     2
 2020-07-21 | 32       |     1
 2020-07-21 | 54       |     2
(6 rows)
 
Zurück
Oben