计算一行中的重复列值

时间:2012-10-16 10:04:18

标签: mysql sql infinidb

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

或者我错过了一些简单易懂的东西? : - )

提前致谢

罗马

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

假设桌子有钥匙,你可以:

  1. 取消表格。

  2. 将不透明的数据集加入原始数据集。

  3. 对于原始列中的每一列,count都与不透明的列匹配。

  4. 以下是如何实施上述内容:

    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列是关键列。 this answer中解释了OR NULL位。

答案 2 :(得分:0)

我找到了一个不同的,非常简单的解决方案: - )

select if(col1=col1,1,0) + if(col2=col1,1,0) + if(col3=col1,1,0) as col1values -- col1 is needle
from table