2015-12-16 4 views
0

Привет, ребята, у меня проблема, которая ест меня часами. То, что я пытаюсь сделать, - подсчитать, сколько строк имеет одинаковое значение из таблицы t2 и показывать только максимальные значения не всех из них. Но я получаю ошибку. Как я могу решить эту проблему? Я не могу найти конкретного ответа.SQL с ошибкой MAX (COUNT)

Msg 130, Level 15, State 1, Line 5 Невозможно выполнить агрегатную функцию на выражение, содержащее совокупность или подзапрос.

.

SELECT t1.operatoriausPavadinimas,count(t2.operatoriausID) as ct 
FROM Operatorius t1,Planas t2 
WHERE t1.operatoriausID=t2.operatoriausID 
Group by t1.operatoriausPavadinimas 
Having COUNT(t2.operatoriausID)>=MAX(COUNT(t2.operatoriausID)) 
+2

тег СУБД, показать некоторые выборочные данные и ожидаемые результаты –

ответ

5

Это верно; вложенные функции агрегации не имеют смысла (хотя функции агрегирования вложенности внутри функций окна имеют смысл). Один простой подход использует оконные функции, которые доступны в большинстве баз данных:

SELECT op.* 
FROM (SELECT o.operatoriausPavadinimas, count(p.operatoriausID) as ct, 
      RANK() OVER (ORDER BY count(p.operatoriausID) DESC) as seqnum 
     FROM Operatorius o JOIN 
      Planas p 
      ON o.operatoriausID = p.operatoriausID 
     GROUP BY o.operatoriausPavadinimas 
    ) op 
WHERE seqnum = 1; 

Примечания:

  • таблицы псевдонимов, которые являются аббревиатуры лучше, чем случайные имена, как t1 и t2 (или a и b).
  • Учиться использовать явный синтаксис JOIN. Простое правило: Никогда запятые запятые в разделе FROM.

EDIT:

Хорошо, в SQL Server, проще всего TOP WITH TIES:

 SELECT TOP (1) WITH TIES o.operatoriausPavadinimas, count(p.operatoriausID) as ct 
     FROM Operatorius o JOIN 
      Planas p 
      ON o.operatoriausID = p.operatoriausID 
     GROUP BY o.operatoriausPavadinimas 
     ORDER BY COUNT(p.operatoriausID) DESC 
+0

Большое спасибо, что решить мою проблему! –