2016-10-19 6 views
0

상위 5 개 (또는 N) 개의 값을 그룹별로 생성하는 쿼리를 작성하기 위해 많은 사이트 (예 : Allen Brown)를 검토했습니다. 이전 쿼리를 테이블로 참조하고 있기 때문에 서브 쿼리 생성에 매달린 것 같습니다.그룹 별 TopN에 대한 쿼리

나는 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에 의해 PI_Issue의 상위 5 수를 생성하도록 바라고 있어요 : 현재는 아래의 데이터 불일치 표현 오류가 있습니다. 충분한 정보를 제공하지 않은 경우 알려주십시오.

답변

0

문제 (또는 적어도 문제)는 [EventMonth]=[qryPI].[EventMonth]입니다. 기본 소스와 조회는 모두 qryPI입니다. 적어도 하나는 별칭을 지정해야합니다.

0

이 작업을 수행 할 수 없습니다

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

count(field)이 정수가 아닌 당신이 액세스 쿼리에 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에 적용하려면

TOP5 제외
SELECT TOP 5 from qryInner 
order by cnt_issue desc 

내가 당신이 원하는 있으리라 믿고있어 무엇 년/월,별로 그룹화 된 모든 쿼리 결과가 아닌 결과에 적용, 그래서이 시도 :

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

찍은 포인트 - 아직까지는 매우 초보자가 아니며 시행 착오와이 보드에서 대부분을 배웠습니다. 조정하는 방법에 대한 생각은 대단히 도움이 될 것입니다. – DChantal

+0

Thanks Beth - 내 무지를 용서하되 나는 다른 쿼리를 만들어 붙여 넣어야합니까? 내가 할 때 집계 함수의 일부로 '지정된 표현식'year (EventDate)를 포함하지 않습니다. – DChantal

+0

@DChantal, 업데이트 된 SQL을 사용해보십시오. 테이블을 만들고 행을 만들어 문법을 확인했습니다. – Beth