按组访问TopN的查询

时间:2016-10-19 17:45:07

标签: ms-access

我已经审查了相当多的网站(例如Allen Brown),用于创建按组生成前5(或N)值的查询。我想我正忙于创建子查询,因为我引用的是先前的查询而不是表格。

我启动了一个查询,按月计算PI的数量(qryPICountbyMonth)。目前,下面给出了数据不匹配表达式错误:

SELECT qryPI.EventMonth, qryPI.PI_Issue, Count(qryPI.PI_Issue) AS
CountOfPI_Issue
FROM qryPI
GROUP BY qryPI.EventMonth, qryPI.PI_Issue
HAVING (((Count(qryPI.PI_Issue)) In (Select Top 5 [PI_Issue] From [qryPI]
Where [EventMonth]=[qryPI].[EventMonth] Order By [PI_Issue] Desc)))
ORDER BY qryPI.EventMonth DESC , Count(qryPI.PI_Issue) DESC;

它是由一个单独的查询构建的,qryPI

SELECT tblPI.EventDate, Format([EventDate],'yyyy-mm',1,1) AS EventMonth, tblPI.PI_Issue
FROM tblPI
WHERE (((tblPI.EventDate) >= #4/1/2016# And (tblPI.EventDate) <= #5/31/2016#))
GROUP BY tblPI.EventDate, Format([EventDate],'yyyy-mm',1,1), tblPI.PI_Issue;

我希望让它通过EventMonth生成前5个PI_Issue计数。如果我没有提供足够的信息,请告诉我。

2 个答案:

答案 0 :(得分:0)

问题(或至少是问题)与[EventMonth]=[qryPI].[EventMonth]有关。您的主要来源和查询都称为qryPI。你必须至少为其中一个别名。

答案 1 :(得分:0)

你不能这样做:

HAVING (((Count(qryPI.PI_Issue)) In (Select Top 5 [PI_Issue] From [qryPI]

count(field)将返回一个整数,而不是您正在计算的值集

我认为您可以在Access查询中指定TopN(它位于属性中),但您必须指定order by子句,因此它知道如何确定TOP。 你试过了吗?

SELECT top 5 
tblPI.EventDate, Format([EventDate],'yyyy-mm',1,1) AS EventMonth, tblPI.PI_Issue
    FROM tblPI
    WHERE (((tblPI.EventDate) >= #4/1/2016# And (tblPI.EventDate) <= #5/31/2016#))
    GROUP BY tblPI.EventDate, Format([EventDate],'yyyy-mm',1,1), tblPI.PI_Issue
    order by PI_Issue

也不确定为什么你在内部查询中使用GROUP BY,因为你没有返回任何聚合函数。您只需要DISTINCT吗?

尝试:

SELECT distinct top 5 
    tblPI.EventDate, Format([EventDate],'yyyy-mm',1,1) AS EventMonth, tblPI.PI_Issue
        FROM tblPI
        WHERE (((tblPI.EventDate) >= #4/1/2016# And (tblPI.EventDate) <= #5/31/2016#))
        order by PI_Issue

实际上,如果我了解您的需求,则需要GROUP BY代替DISTINCT,但您还需要返回COUNT(*)

SELECT 
  Year([eventDate]) AS yr, 
  Month([eventDate]) AS mo, 
  tblPI.PI_issue, 
  Min(tblPI.eventDate) AS MinOfeventDate, 
  Max(tblPI.eventDate) AS MaxOfeventDate, 
  Count(tblPI.PI_issue) AS CountOfPI_issue
FROM tblPI
WHERE 
  (((tblPI.EventDate)>=#4/1/2016# And 
  (tblPI.EventDate)<#6/1/2016#))
GROUP BY 
  Year([eventDate]), 
  Month([eventDate]), 
  tblPI.PI_issue;

然后你想在外部查询中将TOPN函数应用于cnt_issue:

SELECT TOP 5 from qryInner 
order by cnt_issue desc

除了TOP5适用于所有查询结果,而不是按yy / mm分组的结果,这是我假设你想要的,所以试试这个:

SELECT TOP 5 
qry_inner.yr, 
qry_inner.mo, 
qry_inner.CountOfPI_issue, 
qry_inner.PI_issue, 
qry_inner.MinOfeventDate, 
qry_inner.MaxOfeventDate
    FROM qry_inner
    ORDER BY qry_inner.CountOfPI_issue DESC;

据我所知,Access不允许您选择组中的最大行数,因此您需要将外部查询结果限制为一个月,然后应用TOP函数