2017-01-25 3 views
0

Bitte helfen Sie mir Ich habe eine Spalte Delay_Reason in denen ich Werte wie unten haben. Werte können mit "#" enden oder nicht.Fordern Sie die Anzahl der Felder in mysql

DT1-Increased_CT_Reason_Start_to_Accept 

ERIC_Drive Test Taking too Long;#ERIC_Lack Of GSC Resources/Queuing DT Drives;#ERIC_Cluster Having Too Many RF Issues Needing Tuning;# 
ERIC_Drive Test Taking too Long;#ERIC_Lack Of GSC Resources/Queuing DT Drives;# 
ERIC_Drive Test Taking too Long;# 

Ich muss Delay_reason zählen.

Meine gewünschte Ausgabe ist

DT1-Increased_CT_Reason_Start_to_Accept     count 

ERIC_Drive Test Taking too Long       3 
ERIC_Lack Of GSC Resources/Queuing DT Drives    2 
ERIC_Cluster Having Too Many RF Issues Needing Tuning  1 
+0

Was erscheint 'a' nur zweimal in der Zählung? Hast du schon etwas probiert? –

Antwort

4

Ein Trick, den Sie verwenden können, ist die Länge der Delay_Reason Säule gegen die Länge der gleichen Spalte mit einzelnen Buchstaben entfernt zu vergleichen. Dann summiere diese Differenz über die gesamte Tabelle, um die Anzahl der Vorkommen zu erhalten.

SELECT 'a' AS Delay_Reason, 
     SUM(CHAR_LENGTH(Delay_Reason) - CHAR_LENGTH(REPLACE(Delay_Reason, 'a', ''))) count 
FROM yourTable 
UNION ALL 
SELECT 'b', 
     SUM(CHAR_LENGTH(Delay_Reason) - CHAR_LENGTH(REPLACE(Delay_Reason, 'b', ''))) 
FROM yourTable 
UNION ALL 
SELECT 'c', 
     SUM(CHAR_LENGTH(Delay_Reason) - CHAR_LENGTH(REPLACE(Delay_Reason, 'c', ''))) 
FROM yourTable 

Demo hier:

SQL Fiddle

Update:

Wenn Sie die obige Abfrage Arbeit für Begriffe machen wollen, die länger als ein einzelnes Zeichen, die Sie gerade müssen normalisiert werden, indem die Länge der gesuchten Begriffe verwendet wird:

Hier
SELECT 'Los NE abc' AS Delay_Reason, 
     SUM(CHAR_LENGTH(Delay_Reason) - CHAR_LENGTH(REPLACE(Delay_Reason,'Los NE abc',''))) 
     /CHAR_LENGTH('Los NE abc') AS count 
FROM yourTable 
UNION ALL 
SELECT 'Angeles', 
     SUM(CHAR_LENGTH(Delay_Reason) - CHAR_LENGTH(REPLACE(Delay_Reason,'Angeles',''))) 
     /CHAR_LENGTH('Angeles') 
FROM yourTable 
UNION ALL 
SELECT 'California', 
     SUM(CHAR_LENGTH(Delay_Reason) - CHAR_LENGTH(REPLACE(Delay_Reason,'California',''))) 
     /CHAR_LENGTH('California') 
FROM yourTable 

ist eine Demo dieser Abfrage:

SQLFiddle

+0

Lösung funktioniert nur, wenn nur zwei Grund für die Verzögerung gibt es wie ein; #b. Es kann vorkommen, dass die Verzögerung von a oder b oder c irgendwo sein kann, ich meine, dass es a sein kann; #; b; #c oder b; #a; #c, c; #b; #a. – user2503377

+1

Dann haben Sie eine unklare Frage gestellt, mit Beispieldaten, die nicht das tatsächliche Problem widerspiegeln. Aktualisieren Sie Ihre Frage. –

+1

clevere Lösung +1 – SIDU

0
SELECT Delay_Reason,COUNT(*) 
FROM test  
GROUP BY Delay_Reason; 
+0

es wird nicht funktionieren – user2503377

0

Das Problem ist die Datenbank mehrere Werte in einem Feld zu speichern. Das aktuelle Schema verletzt die 3. Normalform.

Eine Lösung besteht darin, eine Abfrage auszuführen, um Ihre Daten zu normalisieren und dann normale Aggregatabfragen für diese Abfrage auszuführen. substring_index kann für diesen Zweck verwendet werden.

SQL Fiddle

CREATE TABLE yourTable (`Delay_Reason` varchar(512)); 

INSERT INTO yourTable (`Delay_Reason`) 
VALUES 
    ('ERIC_Drive Test Taking too Long;#ERIC_Lack Of GSC Resources/Queuing DT Drives;#ERIC_Cluster Having Too Many RF Issues Needing Tuning;#'), 
    ('ERIC_Drive Test Taking too Long;#ERIC_Lack Of GSC Resources/Queuing DT Drives;# '), 
    ('ERIC_Drive Test Taking too Long;#') ; 


select delay_reason, count(*) count from (
    /* 
     normalise the data 
     add as many substring_index union all elements as required 
     */ 
    select SUBSTRING_INDEX(delay_reason, ';#', 1) AS delay_reason from yourTable 
    union all 
    select SUBSTRING_INDEX(SUBSTRING_INDEX(delay_reason, ';#', 2), ';#', -1) AS delay_reason from yourTable 
    union all 
    select SUBSTRING_INDEX(SUBSTRING_INDEX(delay_reason, ';#', 3), ';#', -1) AS delay_reason from yourTable 
    union all 
    select SUBSTRING_INDEX(SUBSTRING_INDEX(delay_reason, ';#', 4), ';#', -1) AS delay_reason from yourTable 
    union all 
    select SUBSTRING_INDEX(SUBSTRING_INDEX(delay_reason, ';#', 5), ';#', -1) AS delay_reason from yourTable 
    union all 
    select SUBSTRING_INDEX(SUBSTRING_INDEX(delay_reason, ';#', 6), ';#', -1) AS delay_reason from yourTable 
    union all 
    select SUBSTRING_INDEX(SUBSTRING_INDEX(delay_reason, ';#', 7), ';#', -1) AS delay_reason from yourTable 
    union all 
    select SUBSTRING_INDEX(SUBSTRING_INDEX(delay_reason, ';#', 8), ';#', -1) AS delay_reason from yourTable 
    union all 
    select SUBSTRING_INDEX(SUBSTRING_INDEX(delay_reason, ';#', 9), ';#', -1) AS delay_reason from yourTable 
    union all 
    select SUBSTRING_INDEX(SUBSTRING_INDEX(delay_reason, ';#', 10), ';#', -1) AS delay_reason from yourTable 
) delay_reasons 
/* remove empty values */ 
where delay_reason <> '' 
group by delay_reason 
order by count desc; 

- Beispiel führt

delay_reason Zählung

ERIC_Drive-Test zu lange dauert 3

ERIC_Lack von GSC Resources/Queuing DT-Laufwerke 2

ERIC_Cluster Zu viel M haben Alle HF-Probleme, die Tuning erfordern 1

Wenn Sie das Recht haben, das Schema zu ändern, können Sie auch die Daten normalisieren.

Verwandte Themen