2011-03-22 11 views
0

У меня есть таблица счетов и таблица транзакций. В докладе, мне нужно, чтобы показать следующую информацию для каждого счета:Эффективно получать минимальные, максимальные и сводные данные

First Purchase Date, 
First Purchase Amount, 
Last Purchase Date, 
Last Purchase Amount, 
# of Purchases, 
Total of All Purchases. 

Таблица транзакций выглядит следующим образом:

TX_UID 
Card_Number 
Post_Date 
TX_Type 
TX_Amount 

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

Образец запроса, чтобы получить все транзакции для одного счета будет:

select * from tx_table where card_number = '12345' and TX_Type = 'Purchase' 

Любые идеи?

ответ

1

попробовать это:

select tt1.post_date as first_purchase_date, 
     tt1.tx_amount as first_purchase_amount, 
     tt2.post_date as last_purchase_date, 
     tt2.tx_amount as last_purchase_amount, 
     tg.pc as purchase_count, 
     tg.amount as Total 
from (select Card_Number,min(post_date) as mipd, max(post_date) as mxpd, count(*) as pc, sum(TX_Amount) as Amount from tx_table where TX_Type = 'Purchase' group by card_number) tg 
join tx_table tt1 on tg.card_number=tt1.card_number and tg.mipd=tt1.post_date 
join tx_table tt2 on tg.card_number=tt2.card_number and tg.mxpd=tt2.post_date 
where TX_Type = 'Purchase' 

Я добавил граф .. Я не видел его в первый раз.

Если вам нужно также краткое изложение на нескольких TX_Types, вы должны взять его из предложения where и поместить его в группу и внутреннее соединение выбора. Но я думаю, вам нужно только для покупок

+0

Спасибо! Я смог использовать это как модель, и она отлично работает. – Erik

0
;with cte as 
(
    select 
    Card_Number, 
    TX_Type, 
    Post_Date, 
    TX_Amount, 
    row_number() over(partition by TX_Type, Card_Number order by Post_Date asc) as FirstP, 
    row_number() over(partition by TX_Type, Card_Number order by Post_Date desc) as LastP 
    from tx_table 
) 
select 
    F.Post_Date as "First Purchase Date", 
    F.TX_Amount as "First Purchase Amount", 
    L.Post_Date as "Last Purchase Date", 
    L.TX_Amount as "Last Purchase Amount", 
    C.CC as "# of Purchases", 
    C.Amount as "Total of All Purchases" 
from (select Card_Number, TX_Type, count(*) as CC, sum(TX_Amount) as Amount 
     from cte 
     group by Card_Number, TX_Type) as C 
    inner join cte as F 
    on C.Card_Number = F.Card_Number and 
     C.TX_Type = F.TX_Type and 
     F.FirstP = 1  
    inner join cte as L 
    on C.Card_Number = L.Card_Number and 
     C.TX_Type = L.TX_Type and 
     L.LastP = 1 
Смежные вопросы