2017-01-25 67 views
0

請幫我看看 我有一列Delay_Reason,其中有像下面這樣的值。值可能以「;#」結尾,也可能不是。需要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;# 

我必須計算delay_reason。

我期望的輸出是可以使用

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

什麼'a'只在計數中出現兩次?你嘗試過什麼嗎? –

回答

4

一個技巧就是在Delay_Reason列的長度比較反對去除個別字母在同一列的長度。然後,在整個表格中總結這種差異以獲得發生次數。

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 

演示在這裏:

SQL Fiddle

更新:

如果你想爲條件上面的查詢工作,這比單個字符長,你只是需要使用搜索條件的長度進行標準化:

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 

下面是該查詢的演示:

SQLFiddle

+0

解決方案將僅在僅存在兩個延遲原因時才起作用; #b。可能發生的情況是,a或b或c的delay_reason可以是任何我認爲它可以是的地方;#; b; #c或b; #a; #c,c; #b; #a。 – user2503377

+1

然後你問了一個不清楚的問題,其中沒有反映實際問題的樣本數據。更新你的問題。 –

+1

聰明的解決方案+1 – SIDU

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

它不會工作 – user2503377

0

的問題是該數據庫在一個字段,其存儲多個值。當前模式違反第三範式。

一種解決方案是運行查詢來標準化數據,然後在該查詢上運行正常的聚合查詢。 substring_index可用於此目的。

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; 

- 例如導致

delay_reason計數

ERIC_Drive測試時間太長3

ERIC_Lack中GSC資源/ DT排隊驅動2

ERIC_Cluster太M了任何需要調諧的射頻問題1

如果您有權更改架構,則還可以規範化數據。 Search Google for third normal form explained