首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按组访问TopN查询

按组访问TopN查询
EN

Stack Overflow用户
提问于 2016-10-20 01:45:07
回答 2查看 28关注 0票数 0

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

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

代码语言:javascript
复制
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的基础上构建的

代码语言:javascript
复制
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。如果我没有提供足够的信息,请让我知道。

EN

回答 2

Stack Overflow用户

发布于 2016-10-20 01:56:59

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

票数 0
EN

Stack Overflow用户

发布于 2016-10-20 02:06:38

你不能这样做:

代码语言:javascript
复制
HAVING (((Count(qryPI.PI_Issue)) In (Select Top 5 [PI_Issue] From [qryPI]

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

我认为您可以在Access查询中指定TopN (它在属性中),但是您必须指定一个order by子句,以便它知道如何确定TOP。您是否尝试过:

代码语言:javascript
复制
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来代替吗?

尝试:

代码语言:javascript
复制
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(*)

代码语言:javascript
复制
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;

然后,您希望在外部查询中对cnt_issue应用TOPN函数:

代码语言:javascript
复制
SELECT TOP 5 from qryInner 
order by cnt_issue desc

除了TOP5应用于所有查询结果,而不是按yy/mm分组的结果,这是我假设您想要的结果,所以尝试如下所示:

代码语言:javascript
复制
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函数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40138219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档