2016-06-14 2 views
2

좋아, 테이블 3 개가 있다고 가정 해 봅시다 : 달력, 사용자 및 요청.열 값을 기반으로 GROUP BY를 사용할 때 고유 행을 반환하십시오.

Calendar.ID, Users.ID 및 requests.ID는 모두 고유합니다. 나는 dbo.Calendar 플러스 users.color 및 requests.Status에서 모든 것을 끌어려고

(즉, 중요한 경우)

SELECT calendar.ID, calendar.date, calendar.type, calendar.userID, users.color, requests.status 
FROM calendar LEFT OUTER JOIN 
    requests ON calendar.ID = requests.calendarID LEFT OUTER JOIN 
     users ON calendar.userID = users.userID 
WHERE(calendar.date >= '2016-06-01') AND (calendar.date <= '2016-12-30') 
group by calendar.id, calendar.date, calendar.type, calendar.userID, users.color, requests.status 

내가 얻을 완료 요청이 있다면 내가 직면하고있어 문제는 중복 된 행이지만이 경우 "보류 중"만 표시되어야합니다.

ID date  type userID color  status 
4 2016-06-16 RE  A  #cc99ff  pending 
5 2016-06-17 RE  A  #cc99ff  accepted 
5 2016-06-17 RE  A  #cc99ff  pending 
6 2016-06-13 LM  B  #ffff99  NULL 
7 2016-06-13 LM  B  #ffff99  accepted 

내가이를 얻으려고 :
ID date  type userID color  status 
4 2016-06-16 RE  A  #cc99ff  pending 
5 2016-06-17 RE  A  #cc99ff  pending 
6 2016-06-13 LM  B  #ffff99  NULL 
7 2016-06-13 LM  B  #ffff99  accepted 

는 참고로 나는 8 년 이상 SQL 감동하지 않은이 내가 일하고 있어요 단지 개인적인 프로젝트입니다.

+0

사용 화레 상태를 <> '접수' –

+0

미안 해요, 난 여전히 다른 기록을 필요로하는 '받아 들여진'가치가있다. – Mark

+0

에 상태 열을 표시 할 때 group by를 사용하는 동안 'accepted'을 생략 할 수 없습니다. 왜냐하면 논리적으로 동일한 ID 날짜 및 기타 열에 대해 '보류 중'및 '수락 됨'이 모두 다르기 때문입니다. –

답변

1

당신은 보이는 조건을 추가 별개의 행이 결국 statu에 대한 당신의 선택
에 disctinct 사용하려면 다음 에 의해 그룹이 필요하지 않습니다 집계 능을 사용하지 않는 id 및 사용자 당 하나 개의 행을 원하지만, 우선 순위에 :

SELECT * 
FROM (SELECT c.ID, c.date, c.type, u.userID, u.color, r.status, 
      ROW_NUMBER() OVER (PARTITION BY c.ID, u.userID 
           ORDER BY (CASE WHEN r.status = 'Accepted' then 1 
               ELSE 2 
              END) desc 
           ) as seqnum 
     FROM calendar c LEFT OUTER JOIN 
      requests r 
      ON c.ID = r.calendarID LEFT OUTER JOIN 
      users u 
      ON c.userID = u.userID 
     WHERE (c.date >= '2016-06-01') AND (c.date <= '2016-12-30') 
    ) rcu 
WHERE seqnum = 1; 
+0

이 작업은 단지 rownum이 seqnum 일 필요가 있습니다. 잘하셨습니다. 당신은 신입니다. – Mark

0

당신은 당신이 status != 'accepted'

SELECT calendar.ID, calendar.date, calendar.type, calendar.userID, users.color, requests.status 
    FROM calendar LEFT OUTER JOIN 
     requests ON calendar.ID = requests.calendarID LEFT OUTER JOIN 
      users ON calendar.userID = users.userID 
    WHERE(calendar.date >= '2016-06-01') AND (calendar.date <= '2016-12-30') 
    AND requests.status != 'accepted' ; 
관련 문제