SQL: выберите все строки, которые удовлетворяют условию, если это условие выполнено, но только определенные строки чисел, если это не так - PullRequest
1 голос
/ 28 марта 2011

У меня есть требование для запроса к SQL Server 2005, которое мне нужно написать, и это ставит меня в тупик, как его выполнить. Я немного упросту это, но суть в том, что, если у клиента нет счетов-фактур, более поздних, чем определенная дата, мне нужно выбрать до 3 самых последних счетов-фактур этого клиента. Но если у них есть счета после этой даты отсечения, просто отобразите любой из этих счетов.

Итак, если моей датой отсечения является 1 января 2010 года, и у меня есть следующие данные:

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

Тогда я хочу выбрать:

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

У кого-нибудь есть идеи? Спасибо

Ответы [ 3 ]

4 голосов
/ 28 марта 2011
  1. Ранжируйте строки для каждого клиента по убыванию BillingDate.

  2. Для каждого клиента выведите следующие даты:

    • более поздние, чем дата отсечения, или

    • относятся к трем наиболее высоко оцененным.

Запрос:

;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 голос
/ 28 марта 2011

Вы можете использовать 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)
0 голосов
/ 28 марта 2011

Как то так должно решить твою проблему?Вы можете даже сделать это подвыбором, если хотите

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...