Есть две таблицы, 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