Агрегирование количеств по нескольким столбцам без курсора или временной таблицы - PullRequest
0 голосов
/ 18 февраля 2011

Если у меня есть таблица с двумя столбцами, A и B, и я хочу подсчитать, сколько раз элемент отображается в обоих столбцах, есть ли способ сделать это без использования курсора или временной таблицы?

Ex:
Column A   Column B
BMW           Ford
Jaguar        BMW
Mercedes      Lexus
Chevrolet     Jaguar
BMW           Ford

Хотелось бы, чтобы результат был:

BMW        3
Jaguar     2
Mercedes   1
Chevrolet  1
Ford       2
Lexus      1

Ответы [ 3 ]

2 голосов
/ 18 февраля 2011
SELECT ColumnA, COUNT(*) as Times
FROM (
  SELECT ColumnA FROM ATable
  UNION ALL
  SELECT ColumnB FROM ATable) Joined
GROUP BY ColumnA

Большинство СУБД требуют псевдонима производной таблицы

1 голос
/ 18 февраля 2011
SELECT x, COUNT(*)
   FROM (SELECT ColumnA AS x FROM t
         UNION ALL
         SELECT ColumnB FROM t)
  GROUP BY x
0 голосов
/ 18 февраля 2011

Вы не говорите СУБД.В случае SQL Server вы можете использовать UNPIVOT, чтобы избежать сканирования таблицы дважды.

SELECT car, COUNT(*)
FROM YourTable
UNPIVOT (car FOR col in (ColumnA, ColumnB)) u 
GROUP BY car

В зависимости от имеющихся у вас индексов это может быть более или менее эффективным, чем подход UNION ALL (Если оба ColumnA и ColumnB были проиндексированы, план запроса UNION ALL мог бы выполнить объединение слиянием по двум индексам и передать их в оператор агрегирования, избегая необходимости сортировать данные, которые потребуются для плана UNPIVOT)

...