2009-06-03 2 views
0

: (모든 텍스트 필드) 다음 작업을 수행 할 것입니다 보고서의 일종 만들 필요가복잡한 액세스 SQL 쿼리 다음과 같습니다 액세스 데이터베이스의 배제

 
Co1 Co2 Co3 Co4 
A k t N1 
B k t N2 
A m t N3 
B k z N4 
A k z N5 
C m t N6 
C k z N7 
C k t N8 
A k t N9 
C m t N10 

:

결과를 행을 선택해야합니다 :

  1. 다음 이산화탄소
  2. 0,123,516에 의해 주문
  3. 첫 CO1 발주
  4. 데이터 만 포함 여기서 CO3 = t 또는 R
  5. CO3을 t 아니며 R 후 종래 C04 CO1 이산화탄소 모든 다른 행은 현재 행과 동일 할 때 있고 제외

1,2 및 3은 매우 쉽게 수행 할 수 있지만 (각각 Order by 및 Where 절) # 4는 액세스 SQL에서 수행 할 수 있습니까? 그럴 수 없다면 데이터를 통해 반복하는 작은 C# 응용 프로그램을 만들 겠지만이 이 SQL에서 가능해야하며 그렇게 할 수 있으면 확실히 더 좋을 것이라고 생각합니다.

실제 쿼리와 데이터베이스는 더 복잡하지만 # 4는 내가 고생하는 곳입니다. 예와

나는 결과가 될 것 주었다

 
A m t N3 
A k t N9 
C m t N6 
C m t N10 
C k t N8

나는이 덮개 모든 가능한 경우를 생각합니다.

정밀도, 우리는 순서를 결정하기 위해 네 번째 열 (이 예제에서는 C4)을 사용하지만 문자와 숫자가있는 텍스트 필드입니다. 필드는 A01, A02, .. A99, B01 등 2 자리 숫자 뒤에 오는 문자입니다. 정밀도 # 2, 나는이 데이터베이스 설계에 대해 비난할만한 사람이 아닙니다. : P

그렇다면 SQL 전문가는 SQL을 액세스 할 수 있습니까? 방법?

제공 할 수있는 도움에 감사드립니다.

+0

제한 사항 # 4을 (를) 이해할 수 없습니다. 다시 말해 줄 수 있니? "이전의 C04가있는 다른 모든 행"은 무엇을 의미합니까? –

+0

@Unknown Google : Andomar는 내 # 4의 문구를 뒤집어서 개선했을 때 매우 정확했습니다. 나중에 행이있는 행을 제외해야합니다. 여기서 Co3은 t가 아니며 r은 같지만 나중에 행이 같은 행이 있습니다. Co1과 Co2 –

답변

0

내가 제대로 읽을 경우

는 CO3을 t도되지 않을 때 R, 다음 CO1 및 이산화탄소가 현재 행과 동일 이전 C04 모든 다른 행은 또한

제외

이는 특정 조건의 나중 행이있는 행을 제외하는 것과 같습니다. NOT EXISTS 절을 사용하면됩니다.

select * 
from YourTable cur 
where cur.Co3 in ('t','r') 
and not exists (
    select * 
    from YourTable later 
    where cur.Co1 = later.Co1 
    and cur.Co2 = later.Co2 
    and later.Co3 not in ('t','r') 
    and CInt(Mid(later.Co4,2)) > CInt(Mid(cur.Co4,2)) 
) 
order by cur.Co1, cur.Co2 desc, CInt(Mid(cur.Co4,2)) 

이제 N10은 N5보다 크지 않습니다. CInt (Mid (..., 2))는 N10을 10으로, N5를 5로 바꿉니다.

+0

Andomar에게 감사드립니다. 조금 수정해야했지만이 모든 것이 정확히 필요한 것입니다. –

0

Co4 시작의 값을 고려한 Andomar의 쿼리 수정 순서를 결정하기 위해 문자 코드의 ASCII 값을 사용하여 다른 문자로 변환합니다. 나는 범위가 A01 ... A99, B01 ... B99 등이고 B01은 A99보다 "나중에"고려되어야한다고 가정하고 있습니다.

select * 
from Table1 cur 
where not exists (
    select 1 
    from Table1 later 
    where cur.Co1 = later.Co1 
    and cur.Co2 = later.Co2 
    and later.Co3 not in ('t','r') 
    and (asc(left(later.Co4,1)) * 100) + CInt(Mid(later.Co4,2)) > (asc(left(cur.Co4,1)) * 100) + CInt(Mid(cur.Co4,2)) 
) 
and cur.Co3 in ('t','r') 
order by cur.Co1, cur.Co2 
0

아직 답변이 없지만 동료 답변을위한 설정 코드입니다.

create table #boost (
    Co1 char(1), 
    Co2 char(1), 
    Co3 char(1), 
    Co4 char(3) 
) 

insert into #boost values ('A', 'k', 't', 'N1') 
insert into #boost values ('B', 'k', 't', 'N2') 
insert into #boost values ('A', 'm', 't', 'N3') 
insert into #boost values ('B', 'k', 'z', 'N4') 
insert into #boost values ('A', 'k', 'z', 'N5') 
insert into #boost values ('C', 'm', 't', 'N6') 
insert into #boost values ('C', 'k', 'z', 'N7') 
insert into #boost values ('C', 'k', 't', 'N8') 
insert into #boost values ('A', 'k', 't', 'N9') 
insert into #boost values ('C', 'm', 't', 'N10') 
+0

누락 된 경우에는 MS Access 질문입니다. – Andomar

+0

원격으로도 유효하지 않습니다. Access SQL : D 게다가 원본 게시물을 편집 했어야합니다. (또는 대리인이 없다면 의견을 말하십시오.) – Oorang