I need the 'first payment date and amount', 'last payment date and amount', 'largest payment date and amount', and 'total payments' for each client by a date range.
tblPayments
ClientID
PaymentDate
PaymentAmount
Thanks for any suggestions.
|||Thank you, but this does not appear to return the amounts associated with each last and first payment dates. That is where I run into problems. I could be reading it bad?
create table p (ClientID int, PaymentDate datetime, PaymentAmount numeric(10,2))insert into p
select 0,'1/1/2004',100 union all
select 0,'1/2/2004',80 union all
select 0,'1/3/2004',110 union all
select 1,'1/5/2004',87 union all
select 1,'1/12/2004',180 union all
select 1,'1/13/2004',10select
d.clientID,
d.firstPmtDate,
p1.PaymentAmount,
d.lastPmtDate,
p2.PaymentAmount,
p3.PaymentDate maxPmtDate,
d.maxPmt,
d.ttlPmt
from
(
select
clientID,
min(paymentdate) firstPmtDate,
max(paymentDate) lastPmtDate,
max(PaymentAmount) maxPmt,
sum(PaymentAmount) ttlPmt
from p
--where PaymentDate between @.startDate and @.endDate
group by clientid
) d
join p p1 on p1.clientid = d.clientid and p1.paymentdate = d.firstPmtDate
join p p2 on p2.clientid = d.clientid and p2.paymentdate = d.lastPmtDate
join p p3 on p3.clientid = d.clientid and p3.PaymentAmount = d.maxPmt
--where p3.PaymentDate between @.startDate and @.endDate
Thanks again,|||Did you run the query in QA with the sample data?|||Ok, It worked in QA. I'm having some trouble understanding how you did this. How can I learn to understand this type of process?
Thanks for any suggestions,|||I'm having trouble converting this to my data. Is there anything specific I should know to do this?
Thanks again,|||What are you having trouble with specifically?|||Well, I get no errors but there is no data being returned.
Thanks,|||To demonstrate the query, I created a table called p, which represents your table tblPayments, it is an example. Then the table p is aliased as p1, p2,p3 where the joins are occuring to simplify the columns assignments. The alias d is used to declare the derived table which perform the aggregate functions to obtain max,min,etc...
If you want to use this query for you purposes you can change the table assignment of p in the from and join clauses to tblPayments.
Does that help to clarify?|||Yes, and that is what I did and I know there is data but none is being returned. This very puzzling.
Thanks again,|||I had not changed the table name in the joins and had listed my table AS p in the From clause. Now I get data, but I get many records for each client. I was hoping to end up with one row for each client. Any thoughts on this?
Thanks again,|||Can you post the revised query you are using..|||Here it is. Thanks,
select
d.Client_ID,
d.firstPmtDate,
p1.AmountPaid,
d.lastPmtDate,
p2.AmountPaid,
p3.PaymentDate maxPmtDate,
d.maxPmt,
d.ttlPmt
from
(
select
Client_ID,
min(paymentdate) firstPmtDate,
max(paymentDate) lastPmtDate,
max(AmountPaid) maxPmt,
sum(AmountPaid) ttlPmt
from tblPayments
--where PaymentDate between @.startDate and @.endDate
group by Client_ID
) d
join tblPayments p1 on p1.Client_ID = d.Client_ID and p1.paymentdate = d.firstPmtDate
join tblPayments p2 on p2.Client_ID = d.Client_ID and p2.paymentdate = d.lastPmtDate
join tblPayments p3 on p3.Client_ID = d.Client_ID and p3.AmountPaid = d.maxPmt
--where p3.PaymentDate between @.startDate and @.endDate|||It is somewhat difficult to fully understand the data behavior w/o seeing the data and variations that occur. If the rows are displaying duplicate data for each client you can modify the main select to select distinct which will limit dups from the results set.
Hope that helps.sql
No comments:
Post a Comment