2013-05-25 3 views
1

쿼리에 group by과 같은 기능을 사용할 때 집계 함수를 사용하는 데 문제가 있습니다. 전체 집계 함수가 전체 쿼리 레코드 세트에 적용되는 대신 쿼리의 특성에 따라 결정되는 선택 그룹에만 적용됩니다. 예를 들어 :이미 그룹화 된 쿼리에서 "totals"함수 사용

Person  Date  Able 
----------------------------- 
    A  21/05/13  0 
    B  21/05/13 -1 
    C  21/05/13 -1 
    D  21/05/13  0 

(grouped by Person, Date, Able) 

집계 함수를 적용 할 때 :

Person  Date  Able Max(Able) Min(Date) 
---------------------------------------------------- 
    A  21/05/13  0   0  21/05/13 
    B  22/05/13 -1   -1  22/05/13 
    C  23/05/13 -1   -1  23/05/13 
    D  24/05/13  0   0  24/05/13 

를 데이터가 완전히 그룹 해제 된 경우를 제외하고 집계 함수가 완전히 중복 만들어집니다. 지금까지 나는 이것을 사용하여 주위를 돌아 다니고있다 :

1) 다른 쿼리를 사용하여 초기 쿼리를 참조하고 실제 집계 값을 결정한다. 2) d 기능 (dlookup, dcount 등) 내 특정 시나리오에서

를 사용하여 양식 호출이 두 번째 쿼리를 가지고, 내가 (특정 순서로 제시 될 필요가 위의 매우 유사한 목록을()가 ID에 따라 순위가 결정됨). 그러나 다른 순위 유형을 정의하기 위해 쿼리에서 식을 사용하고 있습니다. 아이디어는 (조건부 서식을 사용하여)이 새 순위의 첫 번째 레코드를 표시하는 것입니다.

Person  Date  ID CalculatedRank  
-------------------------------------------- 
    A  21/05/13  1  4 
    B  21/05/13  2  2 
    C  21/05/13  3  3 
    D  21/05/13  4  1 

아래 그림 이상적 I 용이하여 acheived 될 수있는 한 최초의 판정 다른 열 싶은 :

first: [CalculatedRank] = Min([CalculatedRank]) 

그러나, 최소()가 저를 제공되지 않는 상술 한 바와 같이 1 , 그것은 줄 단위로 나에게 그것을주고있다. (최소값은 항상 1이 아니므로 임의로 설정할 수는 없다.)

지금 당장이 첫 번째 쿼리를 참조 할 때 별도의 쿼리를 사용하고 계산 된 순위를 기준으로 정렬합니다. 조건부 형식화는 dlookup을 사용하여 두 번째 쿼리에서 첫 번째 여부를 결정할 수 있습니다. 그러나 폼이 새로 고침되거나 쿼리가 호출 될 때마다 모든 단일 행의 조건부 서식이 다른 dlookup을 트리거 한 다음 모든 행에 대해 새 순위를 다시 계산하는 첫 번째 쿼리를 참조합니다.

상상할 수 있듯이 지연 시간이 눈에 띄게 커서 커서가 5 초 이상 유휴 상태가됩니다. 너무 액세스 내부 메커니즘에 대해 확실하지 않지만 inbuilt 디버거를 사용하여 4 행의 레코드 집합에 대한 쿼리는 내 CalculateRank() 함수를 순전히 두 번째 쿼리를 호출하는 조건부 서식을 통해 12 번 호출해야했습니다.

요약하면 필자는 집계 함수를 적절히 사용하기 위해 별도의 쿼리 (따라서 dlookup)가 필요하다는 점을 상당히 좁혔습니다. 모든 쿼리를 하나의 쿼리로 유지할 수 있었다면 조건부 서식은 다른 쿼리에서 dlookup을 사용하여 상태를 결정할 필요가 없습니다.

저는이 문제가있는 유일한 사람이 아니며 모든 누적 쿼리를 피할 수있는 솔루션이 있는지 궁금합니다.

언제나처럼 어떤 도움을 주시면 감사하겠습니다.

답변

1

와우, 무슨 뜻인지 알 겠어!내 표 [표 1]

Person Date  ID 
------ ---------- -- 
A  2013-05-21 1 
B  2013-05-21 2 
C  2013-05-21 3 
D  2013-05-21 4 

및 내 쿼리 [qryTable1Ranked]

표준 VBA 모듈

Public Function CalculateRank(ID As Long) As Long 
Dim r As Long 
Select Case ID 
    Case 1 
     r = 4 
    Case 4 
     r = 1 
    Case Else 
     r = ID 
End Select 
CalculateRank = r 
Debug.Print "x" 
End Function 

에 다음 함수를 사용하고

Person Date  ID CalculatedRank 
------ ---------- -- -------------- 
A  2013-05-21 1    4 
B  2013-05-21 2    2 
C  2013-05-21 3    3 
D  2013-05-21 4    1 
을 반환
SELECT Table1.*, CalculateRank([ID]) AS CalculatedRank 
FROM Table1; 

내가 단지 두려워했을 때 데이터 시트보기에서 열려면 쿼리를 마우스로 클릭하고 순위 지정 함수는 각 행에 대해 한 번 4 번 호출됩니다.

해당 쿼리를 기반으로 연속 양식을 만들고 양식을 연 경우 my 함수가 4 회 호출됩니다. 그런 다음 Value = DMin("CalculatedRank", "qryTable1Ranked")을 사용하여 [CalculatedRank] 텍스트 상자에 조건부 서식을 추가하면 내 함수는 32 번 호출됩니다!

은 내가 [txtMinCalculatedRank] 양식 뒤에 다음 코드를 사용하여 이름이 보이지 않는 언 바운드 텍스트 상자를 추가하면 내가 ...

Option Compare Database 
Option Explicit 

Private Sub Form_Load() 
UpdateMinCalculatedRank 
End Sub 

Private Sub UpdateMinCalculatedRank() 
Me.txtMinCalculatedRank.Value = DMin("CalculatedRank", "qryTable1Ranked") 
End Sub 

절반으로 (16 배)를 잘라 수 있다는 것을 발견 ... 조건부 서식 규칙을 Value = [txtMinCalculatedRank]으로 변경하십시오.

난 (I는 (기본 테이블) Table1qryTable1Ranked에서 폼의 Record Source를 변경 한 경우 I (8 회)를 다시 절반 것을 줄일 수 있음을 발견하고 =CalculateRank([ID])로 [CalculatedRank] 텍스트 상자 Control Source 변경 이전 비틀기의 트릭을 사용함). 이 임시 테이블을 생성하도록까지가는, 또는 기본 테이블에 CalculatedRank (그리고 아마도 "IsMin"플래그를) 지속없이수록

나는 아마 좋은 그 생각 .

+0

Gord, 늦은 답변을 드려 죄송합니다. 나는 당신의 속임수를 사용할 수 있는지, 그리고 이미 그것을 줄이기 위해 이미 가지고있는 것들을 사용할 수 있는지 알기 위해 약간의 시간이 걸리기를 희망했지만 나는 성공적이지 못했습니다. 내가 볼 수있는 일종의 호출 스택이 있었으면 좋겠어요. 그래서 조건부 서식이 언제, 왜 반복적으로 재 쿼리 될지를 판단 할 수있었습니다. 나는 그것이 미래 버전의 접근에서 다루어 져야 할지도 모르는 뭔가라고 생각한다. 노력과 의견을 보내 주셔서 다시 한번 감사드립니다. – rbhalla

관련 문제