2010-03-24 8 views
3

그래, 도움이 필요해. 나는 대개 SQL 쿼리에 꽤 능숙하지만 이것은 나에게 당황 스럽다. 그건 그렇고, 이것은 숙제가 아니라 Access 데이터베이스의 실제 상황이며 아래 요구 사항을 직접 작성했습니다.하나씩 두 개의 행이있는 복잡한 SQL 쿼리


다음은 내 테이블 레이아웃입니다. 그것이 중요한 경우 Access 2007에 있습니다. 나는 SQL을 사용하여 쿼리를 작성하고있다.

Id (primary key) 
PersonID (foreign key) 
EventDate 
NumberOfCredits 
SuperCredits (boolean) 

사람들이 이동하는 이벤트가 있습니다. 하나의 이벤트에서 정상 크레디트 또는 슈퍼 크레디트 또는 둘 다를 얻을 수 있습니다. SuperCredits 열은 행에서 이벤트에서 얻은 수퍼 크레디트 수를 나타내는 경우 true이고, 정상 크레디트를 나타내는 경우 false입니다.

이있는 사람 (174 개)에 참석하는 이벤트이며, 그들이 행사에서 3 일반 학점과 1 슈퍼 학점을 ​​취득한다면, 예를 들어, 다음 두 행이 테이블에 추가 될 것이다 :

ID PersonID EventDate NumberOfCredits SuperCredits 
1 174  1/1/2010 3    false 
2 174  1/1/2010 1    true 

ID PersonID EventDate NumberOfCredits SuperCredits 
1 174  1/1/2010 1    false 
2 174  1/1/2010 2    false 
3 174  1/1/2010 1    true 

지금 우리가를 인쇄 할 : 사람이 행사에서 두 개의 일을 할 수 있었다, 그래서 하나 개의 이벤트에 대한 두 개 이상의 열이있을 수 있습니다, 그것은 다음과 같을 수 있다는 것도 가능하다 보고서. 보고서의 열은 다음과 같습니다.

PersonID 
LastEventDate 
NumberOfNormalCredits 
NumberOfSuperCredits 

보고서에는 1 인당 1 행이 있습니다. 행에는 그 사람이 참석 한 최신 이벤트와 해당 이벤트에서 그 사람이 얻은 정상 및 슈퍼 크레디트가 표시됩니다.

데이터 및 GROUP BY 및 SUM() 및 기타 등등을 선택하는 SQL 쿼리를 작성하거나 작성하는 데 도움을 청합니다. 아니면 가능하지 않은 경우 이것이 가능하면 데이터를 구성하는 방법에 대해 알려주십시오.


이 내용은 매우 혼란 스럽습니다. 퍼즐을 풀 시간이 없다면 이해합니다. 가능한 한 간단하게하려고했지만 명확한 설명이 필요하면 질문을하십시오. 나는 그것을 알아 내려고 노력할 것이다. 그러나 나는 그것에 힘든 시간을 보내고있다, 이것은 나의 경험을 넘어서 그룹화하고있다. ...

답변

3

다음의 쿼리/뷰를 생성한다. (PersonLastEvents 라 불림) :

select PersonId, max(EventDate) as LastEventDate 
from Events 
group by PersonId 

다음과 같이 필요한 데이터를 얻을 수 있습니다. 필자는 Access에 익숙하지 않으므로 일부 구문을 수정해야 할 수도 있지만 잘하면이 방법으로 접근 할 수 있습니다. 여담으로

select l.PersonId, l.LastEventDate, 
    sum(case when e.SuperCredits = 'false' then e.NumberOfCredits end) 
    as NumberOfNormalCredits 
    sum(case when e.SuperCredits = 'true' then e.NumberOfCredits end) 
    as NumberOfSuperCredits 
from PersonLastEvents l 
join Events e on l.PersonId = e.PersonId and l.LastEventDate = l.EventDate 
group by l.PersonId, l.LastEventDate 

, 필요에 따라 열) (당신이 간단하게 요약 할 수 있습니다로 두 개의 숫자 열 (NormalCredits, SuperCredits)를 가지고 테이블을 변경하는 것이 더 쉬울 수 있습니다.

+0

정말 고마워요, 나는 그것을 알아 내지 못했지만 완벽하게 작동했습니다! 내가 바꿀 필요가있는 것은 Access에 case 문이 없으며 대신 switch (condition, value)를 사용한다는 것입니다. 나는 당신에게 여분의 평판을 줄 수있는 방법이 있었으면 좋겠다 !! – Ricket

+1

CASE는 Access/Jet/ACE SQL에서 지원되지 않으므로이 대답은 작동하지 않습니다. 질문에 포함 된 데이터베이스 엔진에 대해 테스트하지 않은 SQL 언어로 질문에 대답하지 마십시오.-1 –

+0

부울 테스트 일 경우 CASE를 iif()로 바꿀 수도 있습니다. –