Как подсчитать количество раз, когда два значения отображаются в двух столбцах в любом порядке
Допустим, у нас есть эта таблица:
+------+------+
| 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 |
+------+------+------+
Ответы
Ответ 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"