2011-03-28 2 views
1

SQL Server 2005 쿼리에 대한 요구 사항이 있습니다. 작성해야하며 수행하는 방법이 저에게 어려움이 있습니다. 그것. 간단히 설명 하겠지만 클라이언트가 특정 날짜보다 최근에 청구서를 제출하지 않은 경우 클라이언트의 최신 청구서를 최대 3 개까지 선택해야합니다. 그러나 마감일 이후에 청구서를 제출하면 해당 청구서를 표시하십시오. 내 컷오프 날짜가 2010년 1월 1일 내가 가지고있는 데이터 인 경우SQL : 조건이 충족 될 경우 조건을 충족하는 모든 행을 선택하십시오. 그렇지 않은 경우 특정 누적 행만 선택하십시오.

그래서, 다음과 같이

ClaimID ClientID BillingDate 
1   1   March 12, 2010 
2   1   June 3, 2010 
4   1   February 9, 2011 
6   2   November 20, 2005 
7   2   October 5, 2009 
10   3   May 7, 2010 
14   4   March 9, 2009 
15   4   December 5, 2007 
17   4   June 3, 2006 

누구나 어떤 아이디어가 :

ClaimID ClientID BillingDate 
1   1   March 12, 2010 
2   1   June 3, 2010 
3   1   January 5, 2008 
4   1   February 9, 2011 
5   1   May 19, 2005 
6   2   November 20, 2005 
7   2   October 5, 2009 
8   3   January 4, 1999 
9   3   July 8, 1997 
10   3   May 7, 2010 
11   3   August 6, 1999 
12   4   May 25, 2000 
13   4   April 1, 2005 
14   4   March 9, 2009 
15   4   December 5, 2007 
16   4   December 19, 1998 
17   4   June 3, 2006 

가 그럼 난 선택하려면? 감사

+1

얼마나 많은 "어떤"를 표시해야합니까? –

+0

모두입니다. 마감일 이후에 결제가 발생하면이를 표시하십시오. – Luke

답변

4
  1. 순위 모든 클라이언트에 대한 행을 원한다면 당신은이 하위 선택 할 수 있습니다. 모든 클라이언트에 대한

  2. , 출력 날짜 그 중 하나

    • 는 컷 - 오프 날짜보다 더 최근의, 또는

    • 는 3 가장 높은 순위들에 속한다.

쿼리 :

;WITH ranked AS (
    SELECT 
    *, 
    rownum = ROW_NUMBER() OVER (PARTITION BY ClientID ORDER BY BillingDate DESC) 
    FROM Billings 
) 
SELECT ClaimID, ClientID, BillingDate 
FROM ranked 
WHERE BillingDate > @CutOffDate OR rownum BETWEEN 1 AND 3 
+1

OP가 말한 것으로부터 생각해 보면, "모두 표시"는 마감일 이후에 발생하는 모든 청구서에 적용됩니다. 따라서 쿼리를 단순화 할 수 있다고 생각합니다. 두 번째 참조에 대한 내부 조인을 제거했습니다. 랭킹 된 행에'BillingDate> @CutOffDate OR rownum BETWEEN 1 AND 3'을 적용하면됩니다. –

+0

@Damien : 왜, 정말로! 그것은 말합니다 : '그 *의 청구서 중 하나.' * 훨씬 더 간단 해졌습니다. 수정 주셔서 감사! –

+1

나는 '주문 BillingDate DESC'라고해야한다고 생각합니다. 귀하의 질의에는 가장 오래된 청구서가 3 통 있습니다. – Martin

1

당신은 두 쿼리의 결과를 결합하는 UNION ALL을 사용할 수 같은

SELECT * 
FROM MyTable 
WHERE BillingDate > '1-Jan-2010' 

UNION ALL 

SELECT * 
FROM MyTable T1 
WHERE NOT EXISTS (SELECT * 
        FROM MyTable T2 
        WHERE T1.ClientID = T2.ClientID AND T2.BillingDate > '1-Jan-2010') 
AND ClaimID IN (SELECT TOP 3 T3.ClaimID 
       FROM MyTable T3 
       WHERE T1.ClientID = T3.ClientID 
       ORDER BY T3.BillingDate DESC) 
+1

두 번째 쿼리의 NOT EXISTS 절은 첫 번째 쿼리와 일치하는 행을 제거합니다. 따라서 쿼리는 "둘 중 하나"를 수행하고 둘 다 수행하지는 않습니다. – srgerg

0

뭔가 문제를 해결해야합니까? 유 BillingDate을 내림차순으로

select ClaimID, ClientID, BillingDate 
from bills 
where BillingDate > @cutoffDate 
UNION ALL 
select ClaimID, ClientID, BillingDate 
from bills a 
where not exists (select 1 from bills b 
     where b.ClientId = a.ClientId 
      and b.BillingDate > @cutoffDate) 
    and 3 >  (select count(1) from bills b 
       where b.ClientId = a.ClientId 
        and b.BillingDate>a.BillingDate) 
관련 문제