的問題是該數據庫在一個字段,其存儲多個值。當前模式違反第三範式。
一種解決方案是運行查詢來標準化數據,然後在該查詢上運行正常的聚合查詢。 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
什麼'a'只在計數中出現兩次?你嘗試過什麼嗎? –