我已经审查了相当多的网站(例如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计数。如果我没有提供足够的信息,请告诉我。
答案 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
函数