2009-10-27 4 views
0

여러 열에서 행 당 최대 값을 결정합니다ACCESS 2007 : 나는 직원 당 여러 날짜 열이있는 테이블이

Emp 1, Date1, Date2, Date3 
    Emp 2, Date1, Date2, Date3 

나는 나에게 반환하는 단일 쿼리를 작성하고 싶습니다 직원 당 기준으로 사용할 수있는 3 가지 날짜의 최대 날짜. 나는 UNION ALL 쿼리를 작성할 필요가 있음을 이해하지만, 사원 레코드 당 최대 값을 얻을 수 있도록 구문을 얻지 못하는 것 같습니다. 나는 모든 직원들에게 동일한 가치를 계속 제공합니다. 나는 이것이 어리석은 실수라고 확신하지만, 그것은 내 견과를 몰고있다. 어떤 도움이라도 대단히 감사 할 것입니다.


감사합니다. iif 문을 사용하지 않고이를 수행 할 수있는 방법이 있습니까? 가능하면 다른 일반 필드가 있기 때문에 일반화하고 싶습니다. 그리고 IIF 논리를 이해하기는 정말 어렵습니다.

또한 이러한 날짜 중 하나라도 비어있을 수 있으며 IIF 논리는 NULL을 최대 값으로 반환하는 것으로 나타났습니다.

이처럼
+1

이 테이블을 정규화 했습니까? (http://www.r937.com/relational.html)? – Fionnuala

+0

정규화 질문에 대한 대답이 무엇인지 꽤 확신 할 수 있다고 생각합니다! –

답변

0

이 작품과 같은 것이 있습니까?

select 
    EmployeeColumn, 
    iff(iif(Date1 > Date2, Date1, Date2) > Date3, iif(Date1 > Date2, Date1, Date2), Date3) 
from yourTable 
+0

사과 - 어떤 이유로이 접근법에 대한 내 의견은 게시되지 않았습니다. 나는 당신이 제안한 논리를 사용하여 끝냈다. 모두의 도움에 감사드립니다. – jhc

0

겠습니까 뭔가 : (가 ACESS에서 작동하는 경우이 MSSQL2008 확실하지 않았다)

테스트 데이터

create table t1 
    (EmployeeId int, 
     Date1 datetime, 
     Date2 datetime, 
     date3 datetime) 

insert into t1 values (1, '2009-10-11', '2009-04-01', '2009-12-25') 
insert into t1 values (2, '2009-10-24', '2009-04-03', '2009-12-19') 

내 쿼리 만들기

select case 
    when date1 > date2 and DATE1 > date3 then date1 
    when date2 > date1 and date2 > date3 then date2 
    when date3 > date1 and date3 > date2 then date3 
    end as highest 
    from t1 
+0

Access에서는 CASE WHEN 대신 IIf를 사용합니다. – Heinzi

1
SELECT ID, Max(TheDate) AS MaxDate 
FROM 
(
    SELECT ID, Date1 AS TheDate 
    FROM myTable 
    UNION 
    SELECT ID, Date2 AS TheDate 
    FROM myTable 
    UNION 
    SELECT ID, Date3 AS TheDate 
    FROM myTable 
) 
GROUP BY ID 

나는이 깨끗한 해결책이 아니다는 것을 알고있다.
그러나 이것은 당신이 쓸 때 UNION 일 때 찾고있는 것입니다.

편집 : UNION 대신 UNION ALL을 사용할 수 있습니다. 위의 쿼리를 사용하면 출력에 차이가 나타나지 않습니다. 내 아이 맥스 (IMAX)를 사용할 수

+0

감사합니다. 이것은 내가 작성하려고했지만 구문은 나를 벗어났습니다. – jhc

0

당신은 SQL에 대한 해결책을 제한하지 않으려면,() 함수 :

Public Function iMax(ParamArray p()) As Variant 
    ' Idea from Trevor Best in Usenet MessageID [email protected] 
    Dim i As Long 
    Dim lngUBound As Long 
    Dim v As Variant 

    v = p(LBound(p)) 
    lngUBound = UBound(p) 
    For i = LBound(p) + 1 To lngUBound 
     If v < p(i) Then 
     v = p(i) 
     End If 
    Next 
    iMax = v 
    End Function 

내가하여 IIf (에서 비유의 "즉시 최대()"를 호출), 즉시 if()는 쿼리 내에서 행 수준 처리를위한 것이기 때문에.

0

와우! 간단한 일을하기에는 너무 복잡합니다. Max(Field-Constant1,Constant2).

내 목표 : 하나의 필드에 따라 값을 조정하지만 계산 된 값을 상수보다 작게 두지 마십시오.두 필드 테이블에

Expample 행 (키 필드, ValueField는) : (Constant1 = 6이 Constant2 = 1 일 때), 나는 (그것을 명확히하기 위해 전체 수학을 넣어

1 10 
2 5 
3 8 
4 Null 

나는 반환하는 선택을 할 마지막 = 후 상단 가장 오른쪽 부분은) 내가 원하는 것입니다 :

1 Max(10-6,1)=Max(4,1)=4 
2 Max(5-6,1)=Max(-1,1)=1 
3 Max(8-6,1)=Max(2,1)=1 
4 Max(Null-6,1)=Max(Null,1)=Null 

그래서 난 그냥 원하는

(Constant1 = 6 Constant2 = 1) 경우는 충분히 명확하지 않을 때 :

1 4 
2 1 
3 1 
4 Null 

Null에주의하십시오.

나는 정말로 더 복잡한 것을 원하지만, 나는 내가 원하는 복잡한 것을 풀 수 있다고 생각한다.

그것으로 재개 될 수있다 : 값이 사용 수학 연산자에 대한 유효 값 널인지 아닌지 -return 널 (안에 allways 단지이다 - 또는 + 등) 계산치 -return 그것이 있다면 수학을 할 수는 있지만 범위 (한 값보다 작지 않고 다른 값보다 크지 않음)로 제한됩니다.

try // try to do the maths 
    MyCalculatedValue=SomeMaths(FieldValue); 
    MyCalculatedValue=Min(Max(MyCalculatedValue,MinValue),MaxValue); 
except // In case the SomeMaths can not be done (FieldValue is Null, negative square, division by zero, etc) 
     MyCalculatedValue=Null; 
end; 
return MyCalculatedValue; 

경우 누군가가 데이터베이스 정규화 아니라고 그냥에서 : 나는 필드에 약간의 수학을하고 싶은, 결과의 제한 내가 의사 코드에 그것을 할 경우

는이 같은 것 범위; 그래서 가장 작은 샘플 데이터베이스는 두 개의 필드 (고유 키 필드, 데이터 필드)만을 가지며 완전히 정규화되지 않는 것이 가능한 하나의 테이블을 가질 것입니다. 나는 행의 일부 필드의 maximun에 대해, 최대 필드 (집계 함수)에 대한 전체 테이블에 대한 maximun 얘기가 아니라 단지 계산 된 값에 상한 및 하한을 넣고 싶지만 Null을 고려하면 그 값 Null이거나 그러한 값을 수행 할 수없는 수학이 수행 될 수 없습니다 (Constant1/(FieldValue-Constant2) 등의 경우). 단지의 경우 누군가에

실제 샘플이 이용 될 수있을 때하지 않습니다

테이블 필드 : 쿼리에 대한

ID (Key) 
SpacePosition (DecimalData) 

원하는 결과 필드 :

ID as ID 
Min(Max(SpacePosition-SomeSpaceLongitud,StartPosition),EndPosition) AS RangeStart 
Min(Max(SpacePosition+SomeSpaceLongitud,StartPosition),EndPosition) AS RangeEnd 

희망 샘플입니다 누군가 VBA 기능을 사용하는 것보다 더 쉽게 뭔가를 도울 수 있기를 바랍니다.

PD : 이러한 수학은 + 및 -보다 복잡하며 테이블에는 많은 레지스터가 있으며, 수십억 레지스터에 가까운 것보다 많은 레지스터가 있다고 생각하십시오. P.P.D : 정규화 된 데이터베이스가없고 최악의 경우 그러한 쿼리 결과를 하드 코드하는 옵션이 아닙니다. 이러한 범위 제한은 쿼리를 실행할 때 사용자가 입력 한 값입니다.