2011-08-04 58 views
1

我有一个基于查询的报表。在报告的详细部分,我想限制细节行的数量为最高N.(如选择TOP N型查询)。在这个例子中,我想要前两行。我到目前为止的查询是如何在访问报表详细信息部分选择top N或在sql子查询中选择top N

SELECT TestTable.[GroupByCol], TestTable.[DetailColA] 
FROM TestTable group by TestTable.[GroupByCol], TestTable.[DetailColA] 

我知道我需要加入并做一些有数量但只是不点击。我还附上了截图。

请指教。谢谢 enter image description here

+0

你需要指定一个ORDER BY,否则你的“TOP 2”是没有意义的,因为这可能是随机的。 – Jacob

+0

@cularis。是。现在从mwolfe02的答案中可以明显看出。 thx – Gullu

回答

2

尝试下面的查询报表记录源:

SELECT TestTable.GroupByCol, TestTable.DetailColA 
FROM TestTable 
WHERE TestTable.DetailColA IN 
    (SELECT TOP 2 DetailColA FROM TestTable AS TT 
    WHERE TT.GroupByCol=TestTable.GroupByCol 
    ORDER BY TT.DetailColA) 
ORDER BY TestTable.GroupByCol, TestTable.DetailColA 

见艾伦·布朗的Subquery Basics以获取更多信息。


编辑:正如您在您的评论暗示,这也可以写成如下:

SELECT a.GroupByCol, a.DetailColA, COUNT(*) As RankNumber 
FROM TestTable AS a INNER JOIN TestTable AS b 
    ON a.GroupByCol = b.GroupByCol 
AND a.DetailColA >= b.DetailColA 
GROUP BY a.GroupByCol, a.DetailColA 
HAVING COUNT(*)<=2 
ORDER BY a.GroupByCol, a.DetailColA, COUNT(*) 

你将不得不基准可以肯定的,但是这第二个版本可能是更有效的。哪个更具可读性可能是个人喜好的问题(我发现第一个版本更直观和可读)。

+0

thx @ mwolfe02。这应该工作。明天会测试和更新。有没有另一种方法来使用having子句来编写这个查询?其实我从这个问题是相似的困惑http://stackoverflow.com/questions/3481916/access-top-n-in-group – Gullu

+0

欣赏它。谢谢 – Gullu