2017-04-15 39 views
0

我有一個表,看起來像這樣計數:MySQL查詢得到的唯一錯誤代碼

# ITEM, operating_system, error_code 
B01NCUBH43, mac, ['E141202', 'E20012'] 
B01N4MN9PL, mac, ['E141202', 'E20012'] 
B06XKH8NXM, win, ['E141202', 'E20012'] 
B01N3AZUH8, mac, ['E00101', 'E141202'] 
B06XRRQ8QV, win, ['E00101', 'E141202'] 
B01NAZ2I1H, mac, ['E00101', 'E141202'] 
B06XKHJ39Q, mac, ['E141202', 'E20012'] 

我需要找到的每個操作系統的每個錯誤代碼的計數。我寫了這個SQL,它給了我正確的答案。但是,它不是一個通用的可擴展解決方案,因爲error_codes是硬編碼的,將來可能會出現新的錯誤代碼。

SELECT Platform, 
E141202, 
E20012 
from 
(SELECT 
    (CASE WHEN operating_system = 'Win' 
     THEN 'Windows' 
     WHEN operating_system = 'Mac' 
     THEN 'Mac' 
    END) Platform, 
    COUNT(CASE WHEN tag like 'liveItem' THEN ITEM END) total_runs, 
    COUNT(CASE WHEN error_code like '%E141202%' THEN ITEM END) E141202, 
    COUNT(CASE WHEN error_code like '%E20012%' THEN ITEM END) E20012 
FROM CrossPlatformYield where tag = 'liveItem' 
GROUP BY Platform)a; 

有沒有什麼辦法讓唯一的錯誤代碼列表和使用,這在每個操作系統的每個錯誤代碼的計數到達執行上述計算?我最好不要使用MySQL查詢來完成它。在最糟糕的情況下,我可以寫一個腳本。

回答

0

你有一個糟糕的數據格式。你應該真的有一個單獨的表,每個項目和每個錯誤一行。

如果有錯誤的列表中的一個固定的數字(比如最多2個),那麼我會建議:

select substring_index(substring_index(replace(replace(cpy.error_code, '[', ''), ']', ''), ',', n.n), ',', -1) as error_code, 
     operating_system, count(*) 
from CrossPlatformYield cpy join 
    (select 1 as n union all select 2) n 
    on n.n <= length(cpy.error_code) - length(replace(cpy.error_code, ',', '')) + 1 
where cpy.tag = 'liveItem' 
group by error_code, operating_system; 
+0

我沒有得到你所提供的SQL正確的答案。錯誤的數量可能更多。最大10。 –