计数一行中重复的列值

问题描述:

我有一个非规范化的表,其中我必须计算其他列中相同值的数量。 我正在使用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 

还是我失去了一些东西简单,会做的招? :-)

在此先感谢

罗马

我发现:-)

select if(col1=col1,1,0) + if(col2=col1,1,0) + if(col3=col1,1,0) as col1values -- col1 is needle 
from table 
不同的,非常非常简单的解决方案

 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

假设表已经得到了钥匙,你可以:

  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中解释。