2010-06-24 5 views
0

레코드가있는 테이블이 있습니다. 예 : CO.Nr 아래의 데이터는 TH-123, Th-456 등입니다. 데이터를 수집해야합니다.이전 행의 데이터를 수집하는 쿼리

Nr.  CO.Nr   Employee  Resp   Description  Date 

1   TH-123   ABC   NULL    HELLO   10.05.2010 
2   TH-123   NULL   S14    NULL   18.05.2010 
3   TH-123   DEF        NULL   13.05.2010 
4   TH-456   XYZ   NULL    NULL    1.07.2010 
5   TH-456   NULL   S19    SOME    NULL 
6   TH-456           TEXT   08.05.2010 
7   TH-456      NULL        28.05.2010 

TH-123의 경우 Nr. 최대 값입니다. 즉 CO.Nr에 의해 그룹으로 시작해야하는 레코드입니다. 따라서 Nr이 3 인 레코드 인 입니다. 다른 열의 값이 NULL이거나 공백 인 경우 레코드 인 위의 레코드로 이동하십시오 Nr을 2로 설정하면 null 값이 있어도 Nr을 사용하여 해당 레코드 위에있는 레코드로 이동합니다. 이 경우 1로 설정합니다. 3 개의 기록에서 나는 날짜의 최대를 취할 필요가있다. 상기 데이터 용 , 내가 미리로서 출력하도록

 CO.Nr   Employee  Resp   Description  Date 

     TH-123   DEF   S14    HELLO   18.05.2010 
     TH-456   XYZ   S19    TEXT    01.07.2010 

감사가 필요!

+0

나는 당신이 저장 프로 시저 또는 코드에서 몇 가지 논리가 필요합니다 추측 할 수 있습니다. 간단한 쿼리로 원하는 것을 수행 할 수 없습니다. – chiccodoro

답변

0

당신은 그것을 여러 가지

select [co.nr], 
(select top(1) employee from mytable b where b.[co.nr]=a.[co.nr] and 
         employee is not null order by nr desc) as employee, 
(select top(1) resp from mytable b where b.[co.nr]=a.[co.nr] and 
         resp is not null order by nr desc) as resp, 
(select top(1) description from mytable b where b.[co.nr]=a.[co.nr] and 
         description is not null order by nr desc) as description, 
(select max([date]) from mytable b where b.[co.nr]=a.[co.nr]) as Date 
from (
select distinct [co.nr] 
from mytable) as a 
+0

고맙습니다. 꽤 잘합니다. 하나의 선택에서, 각 필드에 대해 선택 상위 1을 써야합니다. 중첩 된 선택 사항에 대한 제한 사항 또는 성능 문제? – satya

+0

네, 이것은 레코드의 수에 따라 잘 수행되지 않을 것입니다. 왜냐하면 우리는 네 개의 추가 선택을해야하기 때문입니다. 그러나 [co.nr]에 인덱스가 있다면, 그것을 고쳐야합니다. 이것은 테이블을 통한 단일 스캔으로 성취 될 수 있지만보다 복잡한 방식을 사용해야합니다. – josephj1989

0

원하는 레코드를 선택하려면 subselect를 사용할 수 있습니다. FIRST()가 유효한 집계 함수가 아닌 경우 귀하의 의견에 언급 한 바와 같이,

SELECT MyTable.[CO.Nr], Employees.Employee 
FROM MyTable 
LEFT OUTER JOIN (SELECT FIRST(Employee) as Employee, [CO.Nr] 
       FROM MyTable 
       WHERE Employee IS NOT NULL AND Employee <> '' 
       GROUP BY [CO.Nr] 
       ORDER BY [Nr.] DESC) Employees 
      ON MyTable.[CO.Nr] = Employees.[CO.Nr] 
GROUP BY MyTable.[CO.Nr] 

을 또는 당신이 시도 할 수 있습니다 다음 (내가 운동으로 나머지 열을 떠날거야) 직원의 일에 대해 다음과 같은 뭔가 처럼 SELECT 절에 부속 선택 :

SELECT t.MyTable.[CO.Nr], 
     (SELECT TOP(1) x.Employee 
     FROM MyTable x 
     WHERE x.[CO.Nr] = t.[CO.Nr] 
     AND x.Employee IS NOT NULL AND x.Employee <> '' 
     ORDER BY [Nr.] DESC) as Employee 
FROM MyTable t 
GROUP BY t.[CO.Nr] 
+0

응답을 보내 주셔서 감사합니다.이 쿼리를 실행하면 "FIRST '가 기본 제공 함수의 이름으로 인식되지 않습니다."라는 오류가 발생합니다. 그럼 내가 처음 1로 교체 후 '집계 함수 및 GROUP BY 절이 아니기 때문에'직원 '열이 ​​선택 목록에 유효하지 않습니다. – satya

+0

@lucky 충분히 공정한, 내 대답을 편집하고 어쩌면 두 번째 쿼리를 사용할 수 있습니까? –

+0

고마워요. ... 하나의 선택, 각 필드에 대한 선택 가기 1 쓸 필요가 charm.In처럼 ... 어떤 제약이나 중첩 선택과 성능 문제가 있나요? – satya

관련 문제