SQL Подсчёт количества повторяющихся значений в двух столбцах

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

select 'столбец1', 'столбец2', count(*)
from 'таблица'
group by 'столбец1', 'столбец2'
having count(*) > 1

Сама таблица на входе выглядит примерно так:

На выходе выдаёт суммарное количество вместе с пустыми ячейками, либо вообще ничего не выдаёт. Может кто-нибудь подскажет что я не так делаю?


Ответы (1 шт):

Автор решения: Daniil Loban

Для решения данной задачи нужно использовать UNION ALL который в отличие от UNION сохраняет дубликаты значений при слиянии. (я иправил [email protected] на [email protected] видимо была опечатка)

CREATE TABLE Table1
(
   Column1 VARCHAR(20),
   Column2 VARCHAR(20)
);

INSERT INTO Table1 (Column1, Column2) 
VALUES
('[email protected]', '[email protected]'),
('[email protected]', '[email protected]'),
('[email protected]', '[email protected]'),
('', '[email protected]'),
('', '[email protected]');

SELECT * FROM  /* внешний запрос выборки дубликатов */
  (SELECT Column1 /* внутренний запрос объединение Column2 и Column1 */
   FROM Table1
   UNION ALL
     SELECT Column2
     FROM Table1
  ) as T1 /* задаем алиас для объединенной таблицы */
GROUP BY T1.Column1 /* можно использовать и Column1 */
HAVING Count(Column1) > 1 AND Column1 != '' /* и фильтруем пустые значения*/

В данном случае я использовал фильтр Column1 != '' если значения могут быть NULL, то нужно делать соответствующее сравнение: Column1 != NULL

Результат:

| Column1   |
|-----------|
| [email protected] |
| [email protected] |

Cудя по последнему комментарию еще нужна сумма совпадений, для этого можно использовать во внешнем запросе:

SELECT *, count(Column1) FROM

|   Column1 | count(Column1) |
|-----------|----------------|
| [email protected] |              2 |
| [email protected] |              2 |
→ Ссылка