Выберите последнюю транзакцию и результаты "разворота" - PullRequest
0 голосов
/ 27 марта 2020

Есть две таблицы, billing и billing_details, содержащие все соответствующие данные. Я пытаюсь составить список самых последних транзакций для каждого клиента с определенными деталями транзакции. Структура таблицы следующая:

billing - bill_id, client_id, billing_type
billing_detail - bill_id, item_type, item_no, items

Каждая транзакция (bill_id) может иметь один или два разных элемента (item_type). Желаемый результат:

client_id (номер клиента), bill_id (последний), item_no, количество items, item_no (может отсутствовать), количество items для второго item_no.

Моя попытка работает хорошо, но я сомневаюсь, что это самая элегантная или эффективная попытка.

Я соединил ее, используя несколько различных техник, которые я мы узнали о StackOverflow (что бы я делал без вас, ребята ...), но я уверен, что есть один или два трюка, которые я мог бы изучить, чтобы сделать его более эффективным и элегантным. Будем благодарны за любые идеи, советы или подсказки.

WITH sub AS (
     SELECT b1.client_id, b1.bill_id, bd.item_no, SUM(bd.items) as 'Total', ROW_NUMBER() OVER (PARTITION BY b1.client_id ORDER BY item_no) AS rn
     FROM  billing b1
     INNER JOIN billing_detail bd ON b1.bill_id = bd.bill_id
     WHERE b1.bill_id = (SELECT MAX(b2.bill_id)
                         FROM   billing b2
                         INNER JOIN billing_detail bd2 on b2.bill_id = bd2.bill_id
                         WHERE b1.client_id = b2.client_id
                         AND b2.billing_type = 'I'
                         AND bd2.item_type='C')
     AND bd.item_type IS NOT NULL
     GROUP BY b1.client_id, b1.bill_id, bd.item_no)
SELECT client_id,
       bill_id,
       MAX(CASE WHEN rn=1 THEN item_no ELSE NULL END),
       MAX(CASE WHEN rn=1 THEN total ELSE NULL END),
       MAX(CASE WHEN rn=2 THEN item_no ELSE NULL END),
       MAX(CASE WHEN rn=2 THEN total else null end)
FROM sub
GROUP BY client_id, bill_id
...