2013-07-22 4 views
0

Я ищу способ отображения таблицы, в которой множество нескольких атрибутов появляется более одного раза.Групповой счет в SQL

Например, предположим, что у меня была таблица Tbl1 с атрибутами A, B, C, D, E Как сделать запрос таким, чтобы он отображал только строки, где A, B, C появляются более одного раза (как в тех же A, B, C, что и группа), но D и E могут быть или не быть разными?

Моя попытка:

SELECT * 
FROM Tbl1 
WHERE COUNT(A, B, C) > 1 

и я получаю сообщение об ошибке: «функциональная группа гостей здесь не разрешены»

+2

Какой продукт базы данных вы используете? – siride

+0

Oracle SQL Developer –

+0

«Oracle SQL Developer» не является СУБД, это клиент SQL, и тот, который может подключаться к различным СУБД. Таким образом, до сих пор неясно, какие СУБД вы используете (если бы вы предоставили точное сообщение об ошибке, которое мы могли бы хотя бы вычесть из этого) –

ответ

1

Причина этого заключается в том, что вы не можете использовать эту группировку в WHERE -часть предложение sql.

SELECT colums 
FROM tables 
WHERE condition 

Условие относится к одной строке таблицы.

Что вы хотите HAVING

SELECT colums 
FROM tables 
HAVING condition 

Состояние после HAVING оценивается после группировки и там вы можете использовать функции агрегации как COUNT или SUM

0

Используйте GROUP BY пункт (SQL Server: http://msdn.microsoft.com/en-us/library/ms177673.aspx, MySQL: http://www.tutorialspoint.com/mysql/mysql-group-by-clause.htm).

В каждой группе вы хотите получить количество строк в этой группе (используя COUNT(*)), а затем используйте предложение HAVING для фильтрации по этому счету. HAVING - как статья WHERE для GROUP BY. Он фильтрует результаты группировки и может ссылаться на сгруппированные столбцы (в данном случае A, B и C) или любые агрегаты (в данном случае COUNT(*)).

Вот как выглядел бы ваш запрос. Обратите внимание, что вы можете включать только столбцы в список полей SELECT, которые указаны в GROUP BY или которые содержатся в совокупных функциях, таких как COUNT() и MAX(). MySQL позволит вам уйти с добавлением других столбцов, но SQL Server даст вам сообщение об ошибке. Лучше следовать этому правилу, даже если это позволяет база данных.

SELECT A, 
     B, 
     C, 
     COUNT(*) AS GroupCount 
    FROM Tbl1 
GROUP BY A, B, C 
HAVING COUNT(*) > 1 

Если вы хотите, полные строки, где это так, то вы можете использовали производную таблицу:

SELECT * 
    FROM Tbl1 
    JOIN (
    SELECT A, 
      B, 
      C, 
      COUNT(*) AS GroupCount 
     FROM Tbl1 
    GROUP BY A, B, C 
    HAVING COUNT(*) > 1 
) AS duplicates 
    ON duplicates.A = Tbl1.A AND 
     duplicates.B = Tbl1.B AND 
     duplicates.C = Tbl1.C 
+0

Я получаю ошибку «не выражение GROUP BY» в строке выбора. Idk, если это имеет огромное значение, но я использую Oracle SQL Developer –

+0

Это имеет значение, так как каждый продукт базы данных может иметь разные правила для таких вещей. Тем не менее, я не уверен, почему у вас появятся ошибки для этого, так как это довольно стандартный SQL. – siride

+0

с новым, он говорит «отсутствующее выражение» в HAVING COUNT (*)> 1 –

Смежные вопросы