Werte in Zeile zählen

geniusone

Benutzer
Beiträge
6
Hallo zusammen,

Ich habe eine Tabelle wo die Daten (Spalten 1-31) jeweils in einer Zeile stehen.
In dieser Zeile stehen die Daten als String (z.b. S1 oder K etc.)
Nun würde ich gern zählen wie oft der String K vorkommt.
Weiterhin habe ich dann mehr wie eine Zeile..

Dies bezieht sich auf den Monat und Mitarbeiter.

Ich habe schon überlegt ob der Ansatz Pivot funktionieren kann. Hier kann ich ja Zeilen und Spalten drehen.

Vielen Dank
 
Werbung:
Einfach das K in die where-Bedingung und die count-Funktion nutzen, wie zum Beispiel:

Code:
select count(spalte) from tabelle where spalte = "K"

EDIT:
Mit Strings arbeiten ist immer so ein Ding, da gibt es vieles zu beachten, um ehrlich zu sein, wie ist die Datenbank aufgebaut? Vl. Struktur überdenken?
 
Einfach das K in die where-Bedingung und die count-Funktion nutzen, wie zum Beispiel:

Code:
select count(spalte) from tabelle where spalte = "K"

EDIT:
Mit Strings arbeiten ist immer so ein Ding, da gibt es vieles zu beachten, um ehrlich zu sein, wie ist die Datenbank aufgebaut? Vl. Struktur überdenken?
Das klappt leider nicht. Ich habe ja 31 Spalten wo das K vorkommt, und wenn ich richtig liege dann zählt die count Funktionen ja nur zeilenweise und nicht die Spalten …
 
Hallo zusammen,

Ich habe eine Tabelle wo die Daten (Spalten 1-31) jeweils in einer Zeile stehen.
In dieser Zeile stehen die Daten als String (z.b. S1 oder K etc.)
Nun würde ich gern zählen wie oft der String K vorkommt.
Weiterhin habe ich dann mehr wie eine Zeile..

Dies bezieht sich auf den Monat und Mitarbeiter.

Ich habe schon überlegt ob der Ansatz Pivot funktionieren kann. Hier kann ich ja Zeilen und Spalten drehen.

Vielen Dank
Hier noch mal die Daten wie ich sie bekomme:

1742136312750.webp
 
Das Tabellendesign ist nicht normalisiert, das hat natürlich Folgen.

Du kannst jetzt zwei Wege gehen: Entweder, du normalisiert erst die Tabelle (z.B. mit UNPIVOT oder UNION ALL), eventuell auch dauerhaft als View, oder du verkettest mehrere Abfragen. Beispiel:
Code:
SELECT *
FROM tabelle
WHERE PUE_Kenner1Tag1 LIKE '%K%'
UNION
SELECT *
FROM tabelle
WHERE PUE_Kenner1Tag2 LIKE '%K%'

Das das alles scheiße ist, muss ich hoffentlich nicht erwähnen :)
 
Das Tabellendesign ist nicht normalisiert, das hat natürlich Folgen
Weiß man nicht. Die "Tabelle" könnte auch ein View sein oder sogar nur eine Abfrage.
Wir hatten die letzten Tage mindestens zwei so ähnliche Fragen.
Am besten wäre wie du selbst darauf geantwortet hast, die ursprüngliche query herauszufinden, womit der Pivotdatensatz oben erstellt wurde.
Von dort könnte man dann bequemer vorgehen.
 
Okay ich weiß nicht, ob es eine Tabelle ist, aber die Daten sind nicht normalisiert, per Definition.

Wenn es natürlich die Daten noch irgendwo anders gibt dann sollte man an die Quelle ran. Ich habe selbst so einen Fall wo es tatsächlich nur diese "Kalender"-Darstellung gibt, ist genau eine Tabelle im ganzen Zeiterfassungssystem...
 
Hallo, ich habe es zunächst einmal mit dem Zeiger gelöst..
Also erst eine select mit where, dann in eine tempTable und dann zeilenweise i++ bei Treffer..
 
wie soll ich denn dann die strings zählen pro Spalte? Bzw. das ist ja pro Zeile unterschiedlich..
Strenggenommen kannst Du hier pro Zeile nicht so gut zählen, weil es keine ID für eine Zeile gibt. Ein Spalte mit Datum oder Kalenderwoche würde dabei helfen. Aber wie es aussieht, sind die Daten ja sowieso unvollständig. Es sei denn die Mitarbeiter arbeiten nur 7 Tage.

Aber wie gesagt, dafür gibt es UNPIVOT. PIVOT "dreht" Zeilen zu Spalten, UNPIVOT macht es umgekehrt, Spalten zu Zeilen.
Die Syntax ist etwas seltsam, aber es macht, was es soll.

Code:
-- alle Daten aufgelistet zur Weiterverarbeitung
select un_pivot.pue_jahr,       -- originalwert 
       un_pivot.pue_monat,      -- originalwert
       un_pivot.kenner,       -- neue Spalte, die alle zu zählenden Spalten auflistet
       un_pivot.strings       -- neue Spalte mit den Strings, die Du zählen willst
from ( -- alle relevanten Daten abfragen    
      select pue_jahr, pue_monat, 
             pue_kenner1tag1, pue_kenner1tag2, pue_kenner1tag3, 
             pue_kenner1tag4, pue_kenner1tag5, pue_kenner1tag6, pue_kenner1tag7  
        from tabelle          -- Deine Quelltabelle
     ) as source
UNPIVOT -- UNPIVOT Clause
     ( strings
       for kenner in (        -- alle Spalten die unpivotisiert werden sollen
             pue_kenner1tag1, pue_kenner1tag2, pue_kenner1tag3, 
             pue_kenner1tag4, pue_kenner1tag5, pue_kenner1tag6, pue_kenner1tag7) 
     ) as un_pivot

Code:
-- alle Daten gruppiert, gezählt
select un_pivot.pue_jahr,     -- originalwert 
       un_pivot.pue_monat,    -- originalwert
       un_pivot.kenner,       -- neue Spalte, die alle zu zählenden Spalten auflistet
       un_pivot.strings,      -- neue Spalte mit den Strings, die Du zählen willst
       count(*)
from ( -- alle relevanten Daten abfragen    
      select pue_jahr, pue_monat, 
             pue_kenner1tag1, pue_kenner1tag2, pue_kenner1tag3, 
             pue_kenner1tag4, pue_kenner1tag5, pue_kenner1tag6, pue_kenner1tag7  
        from tabelle          -- Deine Quelltabelle
     ) as source
UNPIVOT -- UNPIVOT Clause
     ( strings
       for kenner in (        -- alle Spalten die unpivotisiert werden sollen
             pue_kenner1tag1, pue_kenner1tag2, pue_kenner1tag3, 
             pue_kenner1tag4, pue_kenner1tag5, pue_kenner1tag6, pue_kenner1tag7) 
     ) as un_pivot
group by un_pivot.pue_jahr, un_pivot.pue_monat, un_pivot.kenner, un_pivot.strings

Code:
-- alle Daten gruppiert, gezählt, nur strings mit Wert 'K'
select un_pivot.pue_jahr,     -- originalwert 
       un_pivot.pue_monat,    -- originalwert
       un_pivot.kenner,       -- neue Spalte, die alle zu zählenden Spalten auflistet
       un_pivot.strings,      -- neue Spalte mit den Strings, die Du zählen willst
       count(*)
from ( -- alle relevanten Daten abfragen    
      select pue_jahr, pue_monat, 
             pue_kenner1tag1, pue_kenner1tag2, pue_kenner1tag3, 
             pue_kenner1tag4, pue_kenner1tag5, pue_kenner1tag6, pue_kenner1tag7  
        from tabelle          -- Deine Quelltabelle
     ) as source
UNPIVOT -- UNPIVOT Clause
     ( strings
       for kenner in (        -- alle Spalten die unpivotisiert werden sollen
             pue_kenner1tag1, pue_kenner1tag2, pue_kenner1tag3, 
             pue_kenner1tag4, pue_kenner1tag5, pue_kenner1tag6, pue_kenner1tag7) 
     ) as un_pivot
where strings = 'K'
group by un_pivot.pue_jahr, un_pivot.pue_monat, un_pivot.kenner, un_pivot.strings


Code:
alle Daten gruppiert, gezählt, nur strings mit Wert 'K', Kenner(Herkunft) weggelassen
select un_pivot.pue_jahr,     -- originalwert 
       un_pivot.pue_monat,    -- originalwert
       un_pivot.strings,      -- neue Spalte mit den Strings, die Du zählen willst
       count(*)
from ( -- alle relevanten Daten abfragen    
      select pue_jahr, pue_monat, 
             pue_kenner1tag1, pue_kenner1tag2, pue_kenner1tag3, 
             pue_kenner1tag4, pue_kenner1tag5, pue_kenner1tag6, pue_kenner1tag7  
        from tabelle          -- Deine Quelltabelle
     ) as source
UNPIVOT -- UNPIVOT Clause
     ( strings
       for kenner in (        -- alle Spalten die unpivotisiert werden sollen
             pue_kenner1tag1, pue_kenner1tag2, pue_kenner1tag3, 
             pue_kenner1tag4, pue_kenner1tag5, pue_kenner1tag6, pue_kenner1tag7) 
     ) as un_pivot
where strings = 'K'
group by un_pivot.pue_jahr, un_pivot.pue_monat, un_pivot.strings
 
Wenn du nir wissen willst wieviele "K" am Tag (ROW) sind kannst du doch einfach dies machen:
Da musst du nur die fehlenden Felder in das erste SELECT einsetzen


Code:
WITH conc AS (
    SELECT id, `PUE_Jahr`, `PUE_Monat`, CONCAT_WS(',',',', `PUE_Kenner1Tag1`, `PUE_Kenner1Tag2`, `PUE_Kenner1Tag31`,',') as c
    FROM ktable
)
SELECT
    id, `PUE_Jahr`,
    CAST((CHAR_LENGTH(c) - CHAR_LENGTH(REGEXP_REPLACE(c, 'K,', '')))/2 AS INT) AS Anzahl_K
FROM  conc;

Das Ergenis:


Code:
1    2025    0
2    2025    1
3    2025    1
4    2025    1
5    2025    2
6    2025    2

Die Tabelle:


Code:
1    2025    2    U    U    K1
2    2025    2    A    K    K4
3    2025    2    X    K    K4
4    2025    2    A    B    K
5    2025    2    K    K    K4
6    2025    2    A    K    K
 
Werbung:
Zeiger sind nicht ideal, sie sind definitiv langsamer als so ziemlich alles andere außer vielleicht Schleifen ;-) Ich setze nur bei wirklich komplexen Dingen auf Cursor, sie lassen sich eigentlich immer vermeiden.

Daten in einer Form des PIVOT sind nicht ideal. Ich hatte ja schon geschrieben, das es die vielleicht noch wo anders in der Datenquelle in normalisiert gibt?

Je nach Anwendungsfall ist beides nicht so tragisch. Wenn Daten z.B. einmalig migriert werden oder Nachts ausgewertet werden ist das Ergebnis entscheidend. Wenn du das aber oft laufen lassen willst, gehe nochmal zum Anfang zurück und hinterfrage deine Schritte.
 
Zurück
Oben