2010-04-19 5 views
2

나는 마이크로 소프트 액세스 2003은이 진술에 대해 불평에 문제가 있어요 :SQL 문은 = 일부 + 일

select cardnr 
from change 
where year(date)<2009 
group by cardnr 
having max(time+date) = (time+date) and cardto='VIP' 

마다 별개의 cardnr를 들어, 내가하고 싶은입니다 테이블 변경에서 2009 년 이전의 최신 (시간 + 날짜) 행을 찾은 다음 cardto = 'VIP'로 행을 선택하면됩니다.

validator은 괜찮다고 말하면서 Access는 그것이 좋지 않다고 말합니다.

다음 메시지가 나타납니다. "최대 (시간 + 날짜) = 시간 + 날짜 및 cardto = 'VIP'및 cardnr = '지정된 표현식을 포함하지 않는 쿼리를 실행하려고했습니다. 집계 함수. "

누군가 내가 잘못하고있는 일과 올바른 방법을 설명해 주시겠습니까? 감사합니다

참고 : 필드 및 테이블 이름이 번역되어 예약어와 충돌하지 않습니다. 이름에 문제가 없습니다.

+0

선택 항목을'cardnr, time, date, cardto ... '로 변경하면 어떨까요? – FrustratedWithFormsDesigner

+1

where 절에있는 모든 요소가 있어야하지 않습니까? –

+1

또 다른 그룹당 최대 질문입니다. http://stackoverflow.com/questions/755918/simple-query-to-grab-max-value-for-each-id et al.을 참조하십시오. – bobince

답변

3

이런 식으로 생각해보십시오. HAVING은 집계가 완료된 후에 적용됩니다. 따라서 집합되지 않은 표현식과 비교할 수 없습니다 (시간 + 날짜도 아니고 카드도 아닙니다).

SELECT cardnr 
FROM change main 
WHERE time+date IN (SELECT MAX(time+date) 
        FROM change sub 
        WHERE sub.cardnr = main.cardnr AND 
          year(date)<2009 
          AND cardto='VIP') 

(시간에 그 날짜 부분을 가정 :

그러나, 같은 당신이 뭔가를 할 수있는 시간과 날짜 (원칙 WEEL 같은 다른 집계 기능과 관련된 행을 얻기 위해 동일) 마지막을 얻을 수 있습니다 필드는 모든 레코드에서 동일합니다. 날짜/시간 필드 두 개를 사용하는 것이 가장 좋지 않으며 필드 이름 예약어를 사용하면 특정 경우 역효과가 발생할 수 있습니다.)

하위 쿼리가 관심있는 레코드를 외부 쿼리에서 가져옵니다.

동년 (날짜) < 200 및 cardto = 'VIP'를 외부 쿼리에 적용하면 성능을 더 향상시킬 수 있습니다.

+0

답변 해 주셔서 감사합니다. 나는 집계 함수가 실제로 수행되는 시점을 이해하려고하는데, 함수가 HAVING 절 내부에 작성되어 있더라도 그룹화가 수행되는 것과 동시에 수행되는 것처럼 느껴진다. 손실 된 "행과 열). 쿼리를 시도하면 cardto = 'VIP'가있는 행 중에서 최신 행을 선택하지 않을까요? (그렇다면, cardo를 외부 쿼리로 이동 시켜서 내가 원하는 것을 수행하도록하는 것입니다.) – Andreas

+1

MAX (시간 + 날짜)가있는 행만 선택하려면 cardto = 'VIP') 동시에 cardto = 'VIP'인 경우, 예 이동하십시오. MAX, MIN 등이 발생하는 시점은 네, HAVING과 GROUP BY가 동시에 일어난다 고 말할 수 있습니다. 중요한 부분은 DB가 '레코드를 거치면서'(WHERE 부분이 평가) 특정 레코드의 MAX는 아직 알 수 없습니다. – Unreason

+0

이것은 많은 것을 정리하고 감사합니다. – Andreas