подсчитывать повторяющиеся значения столбца в одной строке

у меня есть денормализованная таблица, где я должен подсчитать количество одинаковых значений в других столбцах. Я использую механизм хранения 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

или я упускаю что-то простое, что поможет? :-)

заранее спасибо

Римский


person RomanKonz    schedule 16.10.2012    source источник


Ответы (3)


     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

демонстрация скрипки

person solaimuruganv    schedule 16.10.2012

Предполагая, что у таблицы есть ключ, вы можете:

  1. Разверните таблицу.

  2. Присоедините несведенный набор данных обратно к исходному.

  3. Для каждого столбца в оригинале количество совпадений с несведенным столбцом.

Вот как это можно реализовать:

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 объясняется в этот ответ.

person Andriy M    schedule 17.10.2012

Я нашел другое, очень простое решение :-)

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