2012-10-16 70 views
0

我有一個非規範化的表,其中我必須計算其他列中相同值的數量。 我正在使用InfiniDB Mysql存儲引擎。計數一行中重複的列值

這是我的表:

col1 | col2 | col3 
------------------ 
A | B | B 
A | B | C 
A | A | A 

這是我所期望的:

col1Values | col2Values | col3Values 
------------------------------------ 
    1  |  2  |  2  -- Because B is in Col2 and Col3 
    1  |  1  |  1  
    3  |  3  |  3 

有什麼樣

-- function count_values(needle, haystack1, ...haystackN) 
select count_values(col1, col1, col2, col3) as col1values -- col1 is needle 
    , count_values(col2, col1, col2, col3) as col2values -- col2 is needle 
    , count_values(col3, col1, col2, col3) as col3values -- col3 is needle 
from table 

還是我失去了一些東西簡單,會做的招? :-)

在此先感謝

羅馬

回答

0

我發現:-)

select if(col1=col1,1,0) + if(col2=col1,1,0) + if(col3=col1,1,0) as col1values -- col1 is needle 
from table 
不同的,非常非常簡單的解決方案
1
 select 
     CASE WHEN col1 = col2 and col1=col3 THEN '3' 
      WHEN col1 = col2 or col1=col3 THEN '2' 
      WHEN col1 != col2 and col1!=col3 THEN '1' 
     ELSE '0' END AS col1_values, 

     CASE WHEN col2 = col1 and col2=col3 THEN '3' 
      WHEN col2 = col1 or col2=col3 THEN '2' 
      WHEN col2 != col1 and col2!=col3 THEN '1' 
     ELSE '0' END AS col2_values, 

     CASE WHEN col3 = col1 and col3=col2 THEN '3' 
      WHEN col3 = col1 or col3=col2 THEN '2' 
      WHEN col3 != col1 and col3!=col2 THEN '1' 
     ELSE '0' END AS col3_values 

FROM table_name 

fiddle demo

0

假設表已經得到了鑰匙,你可以:

  1. 逆透視表。

  2. 將未轉義的數據集加回原始。

  3. 對於原始中的每一列,count都與未轉義的列匹配。

下面是上面可以實現:

SELECT 
    COUNT(t.col1 = s.col OR NULL) AS col1Values, 
    COUNT(t.col2 = s.col OR NULL) AS col2Values, 
    COUNT(t.col3 = s.col OR NULL) AS col3Values 
FROM atable t 
    INNER JOIN (
    SELECT 
     t.id, 
     CASE colind 
     WHEN 1 THEN t.col1 
     WHEN 2 THEN t.col2 
     WHEN 3 THEN t.col3 
     END AS col 
    FROM atable t 
    CROSS JOIN (SELECT 1 AS colind UNION ALL SELECT 2 UNION ALL SELECT 3) x 
) s ON t.id = s.id 
GROUP BY t.id 
; 

子查詢使用交叉連接到逆透視表。 id列是關鍵列。 OR NULL位在this answer中解釋。