Подтвердить что ты не робот

Как подсчитать количество раз, когда два значения отображаются в двух столбцах в любом порядке

Допустим, у нас есть эта таблица:

+------+------+
| COL1 | COL2 |
+------+------+
|   A  |   B  |
+------+------+
|   B  |   A  |
+------+------+
|   C  |   D  |
+------+------+

Я хочу подсчитать количество раз, когда в двух столбцах появляется либо letter1, letter2, либо letter2, letter1.

Я хочу получить результат:

+------+------+------+
| COL1 | COL2 | COL3 |
+------+------+------+
|   A  |   B  |   2  | 
+------+------+------+
|   C  |   D  |   1  |
+------+------+------+

ПРИМЕЧАНИЕ: Это может быть либо AB, либо BA не имеет значения.

Я пробовал:

SELECT
COL1,COL1,COUNT(*) AS COL3
FROM
X
GROUP BY COL1,COL2;

Но это меня:

+------+------+------+
| COL1 | COL2 | COL3 |
+------+------+------+
|   A  |   B  |   1  |
+------+------+------+
|   B  |   A  |   1  |
+------+------+------+
|   C  |   D  |   1  |
+------+------+------+
4b9b3361

Ответ 1

Вы можете сделать это, заменив столбцы, если вам нужно:

SELECT Col1, Col2, COUNT(*)
FROM
(
    SELECT
        CASE WHEN Col1 < Col2 THEN Col1 ELSE Col2 END AS Col1,
        CASE WHEN Col1 < Col2 THEN Col2 ELSE Col1 END AS Col2
    FROM T
) t
GROUP BY Col1, Col2

Fiddle

Ответ 2

Еще одна попытка

SELECT LEAST(col1, col2) col11, GREATEST(col1, col2) col12 , COUNT(1) FROM X
GROUP BY col11, col12

SqlFiddle

Ответ 3

ОБНОВЛЕНИЕ:: используйте @Damien ответ. Еще одна попытка.

Вы можете попробовать приведенный ниже код. Fiddle

   SELECT COL1, COL2,  COUNT(*) AS COL3
   FROM (
    SELECT
    LEAST(COL1,COL2) AS COL1,
    GREATEST(COL1,COL2)  AS COL2
    FROM X
     ) AS Temp
    GROUP BY COL1,COL2;

Ответ 4

См. http://sqlfiddle.com/#!9/4bd6a/23

Используйте инструкции if и разделите 2 столбца.

SELECT
  DISTINCT (CONCAT(C1,C2)) AS permutation, COUNT(1)
  FROM (SELECT
    IF(col1<=col2, col1, col2) as C1,
    IF(col2<col1, col1, col2) as C2
  FROM X) AS T
  GROUP BY permutation
;

Дальнейшее объяснение: Операторы if просто заказывают символы по значению ASCII, поэтому, независимо от "AB" или "BA", он всегда будет представлен как "AB"