2014-09-17 3 views
1

의 내가 그렇게 보이는 수리 티켓의 테이블이 있다고 가정 해 봅시다 : 나는 상태 그룹의 모든 티켓이 완료된 경우에만 완료 모든 티켓의 목록을 얻기 위해 노력하고SQL Server 2012 창 함수를 사용하여 쿼리를 수행하는 방법?

Group Ticket Status 
---------------------------- 
00798 299696 Open 
21851 574587 Complete 
21851 574588 Pending 
21852 574589 Office 
21866 574613 Test 
21869 574617 Shipping 
21870 574618 Repair 
21871 574620 Open 
2 369151 Repair 
43316 393920 Office 
60669 433162 Office 
65850 445815 Open 
65999 446267 Complete 
66215 446841 Repair 
77818 473653 Complete 
79691 477963 Office 
82277 483787 Pending 
86283 493697 Complete 
86283 493698 Complete 

. 따라서,이 데이터 세트에서, 나는이 티켓을 얻을 것입니다 : 그 그룹 (21851)에서 또 다른 티켓 (574588)이 있기 때문에 나는이 보류, 완료되지로 설정되어 있는지 574,587을 얻을 것이다

446267  
473653  
493697  
493698 

.

ROW_NUMBER() OVER (PARTITION BY GroupNumber, [Status] ORDER BY GroupNumber)의 변형을 하위 쿼리로 사용해 보았지만 내 머리를 감쌀 수 없습니다. 어쩌면 group by와 subquery로 끝낼 수 있을까요? 감사.

+1

내가 당신이 할 수 있다고 생각 : 당신은 단순히 완성 된 티켓의 수 대 각 그룹 티켓의 수를 셀 수 어디에도 존재하지 않는 곳 (...) –

답변

1

SQL 바이올린 : 이들의 http://sqlfiddle.com/#!6/62ecb/2

어느 작동합니다 :

--get every record 
select * 
from RepairTickets a 
--where the status is complete 
where [status] = 'Complete' 
--and the status matches every... 
and [status] = all 
(
    --other record's status 
    select [status] 
    from RepairTickets b 
    --in the same group 
    where b.[Group] = a.[Group] 
) 

또는

--get all records 
select * 
from RepairTickets a 
--where the status is complete 
where [status] = 'Complete' 
--where there is not 
and not exists 
(
    --any record 
    select top 1 1 
    from RepairTickets b 
    --in the same group 
    where b.[Group] = a.[Group] 
    --but with a different status 
    and b.[Status] != a.[Status] 
) 

NB를 : 위의 모두에서, 우리는 찾고 알고 있기 때문에 내부 쿼리와 관련된 [Status]에 대한 참조를 대체하여 최적화 할 수있는 완전한 레코드. 그러나 위의 내용은 수정하기가 쉬워야합니다. 관심있는 상태를 한 곳에서 선언하기 만하면되기 때문입니다.

+1

고마워, 나는 "all"을 인식하지 못했고,이 두 가지 모두 훌륭하다. – BBauer42

1

당신은 그것을 생각하고 있습니다. 창 기능은 모든 경우에 적용 할 수는 없습니다.

WITH tmp AS 
(
    SELECT GroupID, 
      COUNT(TicketID) AS TotalTicket, 
      SUM(CASE WHEN Status = 'Complete' THEN 1 ELSE 0 END) AS CompletedTicket 
    FROM Repair 
    GROUP BY GroupID 
) 

SELECT  Repair.TicketID 
FROM  tmp 
INNER JOIN Repair ON tmp.GroupID = Repair.GroupID 
WHERE  tmp.CompletedTicket = tmp.TotalTicket 

(SQL 바이올린 다운 순간이다 그래서 그것을 게시 할 수 없습니다)

+0

감사합니다.이 솔루션도 잘 작동합니다. – BBauer42