2014-07-22 2 views
1

"그룹"당 단 하나의 행을 검색하기 위해 Access 2013에서 SQL을 사용하여 GROUP BY 쿼리를 만드는 방법에 대해 머리를 감싸지 못했습니다. 모두 열을 유지하면서 다중 열 데이터의 열 중 하나에서 최대 값을 기반으로합니다.여러 열 중 하나를 유지하면서 하나의 필드로 그룹화 된 여러 행 중 하나를 검색하려면

최대 [SupervisorID]의 [ClientID] 행 1 개만 반환하고 싶습니다. 나는 [DispositionID]가 반환되는 것을 신경 쓰지 않습니다. 여기

내가 (내가 유지해야한다는이보다 더 많은 열이있는) 데이터를 가지고있는의 (일부)입니다 :

ClientID LastName FirstName Sex  DispositionID SupervisorID 
6263  Junk  Danny  M  1222   322 
6263  Junk  Danny  M  1223   Null 
6263  Junk  Danny  M  1220   322 
6260  Fake  Angie  F  1208   206 
6244  Junker  Adam  M  1153   322 
6244  Junker  Adam  M  1148   Null 
6257  Junkly  Summer  F  1218   Null 
6257  Junkly  Summer  F  1179   Null 

[된 ClientID], [성], [FIRSTNAME] 및 [ 성별]은 표 A에서 가져옵니다.

[DispositionID]는 [ClientID]와 연결된 표 B에서 가져옵니다.

[SupervisorID]는 표 C ([DispositionID]에서 링크 됨)에서 가져옵니다.

대상 쿼리는 다음을 반환 : I 대상 쿼리를 일단

ClientID LastName FirstName Sex  DispositionID SupervisorID 
6263  Junk  Danny  M  1220   322 
6260  Fake  Angie  F  1208   206 
6244  Junker  Adam  M  1153   322 
6257  Junkly  Summer  F  1179   Null 

, 나는 또 다른 (유사한) 쿼리와 해당 쿼리의 UNION을해야 할 것이다, 내가 그하지 않습니다 영향을 상상하지만, 이 첫 번째 쿼리를 수행하는 방법.

두 쿼리가 결합 된 후에는 특정 [SupervisorID] (예 : 322) 또는 Null [SupervisorID]가있는 행만 표시되도록 해당 쿼리를 필터링해야합니다.

또한 SELECT DISTINCT를 시도했지만 여전히 하나의 ClientID 대신 여러 개의 [ClientID]가 반환되었습니다.

답변

0

시도 :

select x.clientid, 
     x.lastname, 
     x.firstname, 
     x.sex, 
     min(y.dispositionid) as dispositionid, 
     x.supervisorid 
    from (select clientid, 
       lastname, 
       firstname, 
       sex, 
       max(supervisorid) as supervisorid 
      from tbl 
     group by clientid, lastname, firstname, sex) x 
inner join tbl y 
    on x.clientid = y.clientid 
    and x.supervisorid = y.supervisorid 
group by x.clientid, x.lastname, x.firstname, x.sex, x.supervisorid 
union all 
select x.clientid, 
     x.lastname, 
     x.firstname, 
     x.sex, 
     min(x.dispositionid), 
     x.supervisorid 
    from tbl x 
where not exists (select 1 
      from tbl y 
     where y.supervisorid is not null 
      and y.clientid = x.clientid) 
group by x.clientid, x.lastname, x.firstname, x.sex, x.supervisorid 

바이올린 : http://sqlfiddle.com/#!2/1d315/12/0 (일치 원하는 출력)

+0

@Brian. ** 정말 가까이에 있어요. 게시 된 데이터에 대한 출력이 원하는 출력과 일치합니다. 그러나 ClientID에 여러 DispositionID가 있고 동일한 SupervisorID가 각 DispositionID에 할당 될 수 있도록 지정해야합니다. 따라서 동일한 ClientID에 대해 SupervisorID가 두 번 이상 표시되면 (예 : ClientID에 각 DispositionID에 대해 동일한 SupervisorID가있는 2 개의 DispositionID가 있음) 해당 ClientID에 대해 여러 행을 얻습니다. 즉, 새 데이터로 ClientID 6263을 두 번 나열합니다. 한 번만 ClientID가 필요합니다. DispositionID가 표시되거나 손실 된 것에 대해서는 상관하지 않습니다. 원본 데이터를 수정하겠습니다. – DRC

+0

@ user3862163 방금 쿼리의 첫 번째 부분에 max (감독자)에 대한 첫 번째 처리 만 표시되도록 sql을 업데이트했습니다. 그렇게하면 최대 (감독자)가 2 이상의 성향 ID를 가지면 첫 번째 성향 만 나열됩니다. 그게 지금 작동합니까? –

+0

예! 그것은 아름답게 작동합니다. SQL이 어떻게 작동하는지 알아보기 위해 SQL을 연구해야합니다. 많은 감사합니다. – DRC

0

이 때문에 NULL 값이 조금 까다 롭습니다. 그래야 작동합니다 :

select d.* 
from data as d inner join 
    (select clientId, max(dispositionid) as maxd, max(superviserid) as maxs 
     from data 
     group by clientid 
    ) as c 
    on d.clientId = c.clientId and 
     (d.supervisorId = c.maxs or 
     c.maxs is null and d.dispositionid = c.maxd 
     ); 
+0

Thanks @Gordon 불행히도, 그 SQL 밖으로 시도 할 때 원래 테이블 같은 값을 반환합니다. 나열된 코드를 내 유일한 변경 "데이터"내 테이블의 이름 (즉, 내 Table1 내 이름을 변경하려면 내 테스트 데이터베이스). – DRC

+0

@ user3862163 .. 죄송합니다. '왼쪽 결합'이 아닌 '내부 조인'이어야합니다. –

+0

감사합니다. @Gordon. 정말 가깝습니다. 브라이언이 제공 한 대답에 대해 언급했듯이, ClientID가 여러 개의 DispositionID를 가질 수 있고 동일한 SupervisorID가 각 DispositionID에 할당 될 수 있다고 지정했습니다. 따라서 SupervisorID가 동일한 ClientID에 대해 두 번 이상 표시되면 (예 : ClientID = 6263의 DispositionID = 1222와 = 동일한 SupervisorID = 322)를 사용하면 여러 행이 표시됩니다. 해당 ClientID에 대해 즉, 업데이트 된 데이터로 ClientID 6263이 두 번 나열됩니다. 한 번만 ClientID가 필요합니다. DispositionID가 표시되거나 손실 된 것에 대해서는 상관하지 않습니다. 원본 데이터를 수정했습니다. – DRC

관련 문제