2015-02-21 4 views
1

У меня есть результирующий набор запланированных транзакций (запланированная дата и запланированная сумма), соединенных с списком фактической транзакции (Фактическая дата и фактическая сумма), которая была сделана.Множественная сгруппированная информация в одном запросе

Я подаю иск на SQL Azure.

Что мне нужно, чтобы получить это, для каждого schedule_id, мне нужно знать:

Последняя дата была сделана выплата (Так, MAX Фактическая дата) для расписания.

Соответствующая сумма этого платежа (Таким образом, фактическая сумма на дату найденной выше)

Идентификатор оплаты последнего платежа (Actual_transaction_id).

Следующая дата оплаты за график с (Таким образом, MIN scheduled_date где фактическая дата IS NULL)

Сумма очередного платежа, расположенной выше.

Вот код для создания тестовых данных:

SET DATEFORMAT DMY 

DECLARE @tbl TABLE 
(
    schedule_id INT NOT NULL, 
    scheduled_date DATE NOT NULL, 
    actual_date DATE NULL, 
    scheduled_amount DECIMAL(16,2) NOT NULL, 
    actual_amount DECIMAL(18,2) NULL, 
    actual_tranaction_id INT NULL 
) 

INSERT INTO @tbl 
SELECT 77, '2014-06-17', '2014-06-17',292.18, 292.18 ,1 UNION 
SELECT 77, '2014-07-17', '2014-07-17',292.18, 292.18 ,2 UNION 
SELECT 77, '2014-08-17', '2014-08-17',292.18, 292.18 ,3 UNION 
SELECT 77, '2014-09-17', '2014-09-17',292.18, 292.18 ,4 UNION 
SELECT 77, '2014-10-17', '2014-10-17',292.18, 292.18 ,5 UNION 
SELECT 77, '2014-11-17', '2014-11-17',292.18, 292.18 ,6 UNION 
SELECT 77, '2015-02-17', '2015-02-18',504.00, 504.00 ,7 UNION 
SELECT 77, '2015-03-17', NULL,504.00, NULL, NULL UNION 
SELECT 77, '2015-04-17', NULL,504.00, NULL, NULL UNION 
SELECT 77, '2015-05-17', NULL,504.00, NULL, NULL UNION 
SELECT 77, '2015-06-17', NULL,504.00, NULL, NULL UNION 
SELECT 77, '2015-07-17', NULL,504.00, NULL, NULL UNION 
SELECT 77, '2015-08-17', NULL,504.00, NULL, NULL UNION 
SELECT 77, '2015-09-17', NULL,504.00, NULL, NULL UNION 
SELECT 77, '2015-10-17', NULL,504.00, NULL, NULL UNION 
SELECT 77, '2015-11-17', NULL,504.00, NULL, NULL UNION 
SELECT 77, '2015-12-17', NULL,504.00, NULL, NULL UNION 
SELECT 92, '2014-06-17', '2014-06-17',700.00, 700.00,10 UNION 
SELECT 92, '2014-07-17', '2014-07-17',550.00, 700.00, 11 UNION 
SELECT 92, '2014-08-17', '2014-08-17',700.00, 700.00, 12 UNION 
SELECT 92, '2014-09-17', '2014-09-17',700.00, 700.00, 13 UNION 
SELECT 92, '2014-10-17', '2014-10-16',620.00, 580.00, 14 UNION 
SELECT 92, '2014-11-17', '2014-11-14',600.00, 601.00, 15 UNION 
SELECT 92, '2014-12-17', '2014-12-17',700.00, 702.00, 16 UNION 
SELECT 92, '2015-01-17', '2015-01-17',850.00, 851.00, 17 UNION 
SELECT 92, '2015-02-17', '2015-02-17',850.00, 853.00, 18 UNION 
SELECT 92, '2015-03-17', NULL,850.00, NULL, NULL UNION 
SELECT 92, '2015-04-17', NULL,850.00, NULL, NULL UNION 
SELECT 92, '2015-05-17', NULL,850.00, NULL, NULL UNION 
SELECT 92, '2015-06-17', NULL,850.00, NULL, NULL UNION 
SELECT 92, '2015-07-17', NULL,850.00, NULL, NULL UNION 
SELECT 92, '2015-08-17', NULL,850.00, NULL, NULL UNION 
SELECT 92, '2015-09-17', NULL,850.00, NULL, NULL UNION 
SELECT 92, '2015-10-17', NULL,850.00, NULL, NULL UNION 
SELECT 92, '2015-11-17', NULL,850.00, NULL, NULL UNION 
SELECT 92, '2015-12-17', NULL,850.00, NULL, NULL UNION 
SELECT 92, '2016-01-17', NULL,850.00, NULL, NULL UNION 
SELECT 92, '2016-02-17', NULL,850.00, NULL, NULL UNION 
SELECT 92, '2016-03-17', NULL,850.00, NULL, NULL 

SELECT * FROM @tbl 

и ожидаемый результат будет, в этом случае, два ряда:

scheduleId, lastPaymentDate, lastPaymentAmount, nextPaymentDate, nextPaymentAmount 
77, 2015-02-18, 504.00, 2015-03-17, 504.00 
92, 2015-02-17, 853.00, 2015-03-17, 850.00 

Является ли это вообще возможно, чтобы как-то сделать это в эффективном одном запросе? Или это нужно разбить на несколько запросов с собственным ГДЕ и группировкой?

ответ

1

Это один из способов сделать это:

SELECT 
    t.schedule_id, 
    a.actual_date, 
    a.actual_amount, 
    s.scheduled_date, 
    s.scheduled_amount 
FROM (
    select 
     distinct schedule_id 
    from 
     tbl 
) t 
    outer apply (
    select top 1 
     actual_date, 
     actual_amount 
    from 
     tbl a 
    where 
     a.schedule_id = t.schedule_id and 
     a.actual_date is not null 
    order by 
     actual_date desc) a 
    outer apply (
    select top 1 
     scheduled_date, 
     scheduled_amount 
    from 
     tbl s 
    where 
     s.schedule_id = t.schedule_id and 
     s.scheduled_date > getdate() 
    order by 
     scheduled_date asc) s 

Производная таблица извлекает идентификаторы и 2 внешние в своей работе применяет выборку фактических и плановых сумм с верхней 1.

+0

Это прибило его! Благодаря @JamesZ – Craig

1

Попробуйте это заявление:

;WITH cte 
      AS (SELECT * , 
         ROW_NUMBER() OVER (PARTITION BY schedule_id ORDER BY actual_date DESC, scheduled_date DESC) AS rn1 , 
         ROW_NUMBER() OVER (PARTITION BY schedule_id ORDER BY actual_date , scheduled_date) AS rn2 
       FROM  @tbl 
      ) 
    SELECT c1.schedule_id , 
      c2.actual_date , 
      c2.actual_amount , 
      c1.scheduled_date , 
      c1.scheduled_amount 
    FROM cte c1 
      JOIN cte c2 ON c1.rn1 = c2.rn2 
    WHERE (c1.rn1 = 1 
       OR c1.rn2 = 1 
      ) 
      AND c2.rn1 = 1 

Выход:

schedule_id actual_date  actual_amount scheduled_date scheduled_amount 
77   2015-02-18  504.00   2015-03-17  504.00 
92   2015-02-17  853.00   2015-03-17  850.00 
Смежные вопросы