Search code examples
mysqlsqlmysql-error-1111

trying to get the overdue members by the due day


this is the actual query

Select members.member_Id, membertomships.memberToMship_DueDay, sum(memberToMship_ChargePerPeriod)-sum(memberAccTran_Value) as StillDue 
from membertomships 
left join mshipoptions on membertomships.mshipOption_Id = mshipoptions.mshipOption_Id
left join members on membertomships.member_Id = members.member_Id
left join memberacctrans on memberacctrans.member_Id = members.member_Id
WHERE sum(if(memberToMship_DueDay<CURDATE(),0,memberToMship_ChargePerPeriod))>sum(memberAccTran_Value);

modified query:

Select 
    members.member_Id, 
    membertomships.memberToMship_DueDay, 
    sum(sum(memberToMship_InductionFee+memberToMship_JoinFee + (IF(mshipOption_Period='year', TIMESTAMPDIFF (YEAR ,memberToMship_StartDate, memberToMship_EndDate), TIMESTAMPDIFF (MONTH ,memberToMship_StartDate, memberToMship_EndDate)) * memberToMship_ChargePerPeriod))) - sum(memberAccTran_Value) as StillDue 
from membertomships 
left join mshipoptions on membertomships.mshipOption_Id = mshipoptions.mshipOption_Id
left join members on membertomships.member_Id = members.member_Id
left join memberacctrans on memberacctrans.member_Id = members.member_Id
group by member_Id
having sum(if(memberToMship_DueDay<today(),0,memberToMship_ChargePerPeriod))>sum(memberAccTran_Value);

note :paymenttable = memberacctrans table

got the error like this

                          Error Code: 1111
                         Invalid use of group function

would any one pls help me on this query


Solution

  • You'll make everything a lot easier if you would store for each payment also which membertomship record it refers to!

    Try the following SQL Query to show all open dues:

    Select member_id, max(membertomship_dueday), sum(membertomship_Totalfee)-sum(payment_Money) as StillDue
    from membertomship 
    left join member_table on membertomship.memberID = member_table.member_id
    left join payments on payment_member_id = member_table.member_id
    group by member_id
    having sum(membertomship_Totalfee)>sum(payment_Money)
    

    From there you can improve it to only calculate the fees that are already due: (I don't know which database server you use, so the syntax for the IF may be incorrect!)

    Select member_id, (membertomship_dueday), sum(membertomship_Totalfee)-sum(payment_Money) as StillDue 
    from membertomship 
    left join member_table on membertomship.memberID = member_table.member_id
    left join payments on payment_member_id = member_table.member_id
    group by member_id
    having sum(if(membertomship_dueday<today(),0,membertomship_Totalfee))>sum(payment_Money)