пытаясь получить просроченных членов в срок - PullRequest
0 голосов
/ 11 июля 2011

это фактический запрос

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);

модифицированный запрос:

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);

примечание: таблица выплат = таблица мембран

получил ошибку, как это

                          Error Code: 1111
                         Invalid use of group function

Может ли кто-нибудь помочь мне в этом вопросе

Ответы [ 2 ]

1 голос
/ 11 июля 2011

Не зная типов данных в ваших таблицах и предполагая, что вы используете простой тип «дата» для полей даты, вы могли бы просто сделать это: (обратите внимание, где вы видите, КАК это созданное поле, вы можете переименовать их)

SELECT
member_overdue.member_id,
member_overdue.member_firstname,
member_overdue.member_lastname,
DATEDIFF(CURDATE(),membertomship.membertomship_dueday) AS days_diff
FROM
membertomship
Inner Join member_table AS member_overdue ON member_overdue.member_id = membertomship.member_Id
WHERE
membertomship.membertomship_dueday <  CURDATE()

Теперь используя этот набор данных в member_table:

member_id    member_firstname    member_lastname
1            brandon             s
2            sally               s
3            gregg               s

и этот набор данных для членства:

membertomship_id    membertomship_StartDate membertomship_enddate   membertomship_Totalfee  membertomship_dueday    membertomship_paymethod member_Id
1                   6/1/2011                7/1/2011                45                  7/1/2011                cash                      1
2                   7/1/2010                8/3/2011                45                  8/3/2011                cc                        2
3                   1/1/2009                5/1/2011                45                  5/1/2011                cc                        3

Дали мне этот набор результатов:

member_id    member_firstname    member_lastname    days_diff
1            brandon             s                  10
3            gregg               s                  71

помните, что оператор выбора member_overdue является псевдонимом, который я установил во внутреннем соединении, левая и правая части здесь не являются ничем, а ваша другая таблица не имеет значения, если платежи также обновляют таблицу членства. Если это правда, тогда этот простой запрос - все, что вам нужно.

1 голос
/ 11 июля 2011

Вы сделаете все намного проще, если будете хранить для каждого платежа также запись членства, к которой он относится!

Попробуйте следующий запрос SQL, чтобы показать все открытые взносы:

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)

Оттуда вы можете улучшить его, чтобы рассчитать только причитающиеся сборы: (Я не знаю, какой сервер базы данных вы используете, поэтому синтаксис IF может быть неправильным!)

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)
...