Использование TOP 5 с COUNT и LEFT JOIN - PullRequest
0 голосов
/ 17 августа 2010

Я использовал следующий код, данный мне от HansUp (ура!), И он прекрасно работал:

SELECT g.ID, Count(t.Grade) AS Total
FROM grade AS g 
LEFT JOIN (SELECT Grade FROM telephony WHERE [Date] BETWEEN #08/16/2010# AND #08/20/2010#) AS t ON g.ID=t.Grade 
GROUP BY g.ID 
ORDER BY 2 DESC; 

Сейчас я ищу, чтобы найти ТОП 5 результатов. Я думал, что это будет так же просто, как:

SELECT **TOP 5** g.ID, Count(t.Grade) AS Total
FROM grade AS g 
LEFT JOIN (SELECT Grade FROM telephony WHERE [Date] BETWEEN #08/16/2010# AND #08/20/2010#) AS t ON g.ID=t.Grade 
GROUP BY g.ID 
ORDER BY 2 DESC; 

К сожалению, это не работает.

У кого-нибудь есть идеи?

Спасибо

Ответы [ 3 ]

3 голосов
/ 17 августа 2010

Предложение TOP получит вас в топе на основе вашего первого поля сортировки.Поскольку ваше первое поле сортировки является константой (2) для всех записей, вы получаете все записи.Добавьте поле ID в ваше предложение ORDER BY, и вы получите только пять записей.

SELECT TOP 5 g.ID, Count(t.Grade) AS Total
FROM grade AS g LEFT JOIN (SELECT Grade FROM telephony WHERE [Date] BETWEEN #08/16/2010# AND #08/20/2010#)  AS t ON g.ID = t.Grade
GROUP BY g.ID
ORDER BY g.ID, 2 DESC;

Если вы на самом деле после первой пятерки по сумме в порядке убывания, измените SQL на следующее:

SELECT TOP 5 g.ID, Count(t.Grade) AS Total
FROM grade AS g LEFT JOIN (SELECT Grade FROM telephony WHERE [Date] BETWEEN #08/16/2010# AND #08/20/2010#)  AS t ON g.ID = t.Grade
GROUP BY g.ID
ORDER BY Count(t.Grade) DESC , 2 DESC;

Это по значению сверху, поэтому, если общее количество записей в одной записи совпадает и окажется в верхнем 5 значении Total, вы получите их обратно.Если вы действительно хотите вернуть только пять записей, вам нужно отсортировать по уникальному полю.

0 голосов
/ 31 марта 2011

Насколько я вижу, это должно работать:

  SELECT TOP 5 g.ID, Count(t.Grade) AS Total
  FROM grade AS g 
  LEFT JOIN (SELECT Grade FROM telephony WHERE [Date] BETWEEN #08/16/2010# AND #08/20/2010#) AS t ON g.ID=t.Grade 
  GROUP BY g.ID 
  ORDER BY Count(t.Grade) DESC;

Ключевым моментом здесь является то, что вы используете полное выражение из оператора SELECT, когда хотите использовать его в предложении WHERE или ORDER BY.

Если бы вы просто использовали сетку запросов Access для написания своего SQL, вы бы сразу получили правильные результаты (хотя вам пришлось бы погрузиться в представление SQL, чтобы написать свой подзапрос).

0 голосов
/ 17 августа 2010

Это должно работать.

SELECT TOP 5 g.ID, Count(t.Grade) AS Total
FROM grade AS g 
LEFT JOIN (SELECT Grade FROM telephony WHERE [Date] BETWEEN #08/16/2010# AND #08/20/2010#) AS t ON g.ID=t.Grade 
GROUP BY g.ID 
ORDER BY 2 DESC
...