0

我一直在使用 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; 

我现在正在寻找返回的 TOP 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; 

不幸的是,这不起作用。

有没有人有任何想法。

谢谢

4

3 回答 3

3

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;

如果您实际上按降序排列在 Total 前 5 名之后,请将 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 个值中,您将全部取回。如果您真的只想要返回 5 条记录,则必须对唯一的字段进行排序。

于 2010-08-17T19:33:41.420 回答
0

据我所知,这应该有效:

  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;

这里的关键点是,当您想在 WHERE 或 ORDER BY 子句中使用 SELECT 语句中的完整表达式时,您可以使用它。

如果您只是使用 Access 查询网格来编写 SQL,那么您将立即获得正确的结果(尽管您必须深入 SQL 视图来编写子查询)。

于 2011-03-30T20:32:23.763 回答
0

这应该有效。

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
于 2010-08-17T10:03:58.100 回答