#sql-server
#sql-server
Вопрос:
У меня есть таблица, в которой сохраняются данные о кредите сотрудника. Некоторые сотрудники получают ссуду еженедельно и хотят возвращать каждый взнос еженедельно, а некоторые хотят возвращать взносы ежемесячно. Я хочу получить общую продолжительность периода кредитования, если сотрудник желает возвращать платежи еженедельно, тогда он должен выдавать результат типа 5 Weeks
или 10 Weeks
, но если сотрудник желает возвращать платежи ежемесячно, он должен выдавать результат типа 4 Months
или 15 Months
.
Вот примерные данные
LoanID DueDate AmountToBePaid
2 2019-01-01 500
2 2019-01-07 500
2 2019-01-14 500
2 2019-01-21 500
2 2019-01-28 500
3 2019-01-01 1500
3 2019-02-01 1500
3 2019-03-01 1500
3 2019-04-01 1500
Вот что я пробовал, но это выдает результат в неделях, независимо от того, должны ли ежемесячно выплачиваться взносы по идентификатору кредита 3.
SELECT
LoanId,
DATEDIFF(WEEK, inst_start, inst_end) weeks
FROM LoanMaster LM
INNER JOIN (
SELECT
dateadd(month, -1,min(duedate)) inst_start,
max(duedate) inst_end
FROM LoanDetail
) LD
ON LM.ID = LD.LoanID
Выход должен быть похожим:
LoanId Duration
2 4 Weeks
3 3 Months
Ответ №1:
Если ваши данные строго следуют правилу, согласно которому для одного и того же LoanID соответствующими датами будут либо только последовательные недели, либо только последовательные месяцы, тогда мы можем вывести период, разделив диапазон на количество строк:
SELECT
LoanID,
case
when datediff(month,min(DueDate),max(dueDate))=count(*)-1
then str(datediff(month,min(DueDate),max(dueDate))) ' Months'
else
str(datediff(week,min(DueDate),max(dueDate))) ' Weeks'
end as Duration
FROM LoanMaster LM
GROUP BY LOANID