Необходимо выполнить приведенный ниже sql-запрос для автоматического перехода к месяцу n (последнему оплаченному) с начала (open_date)

#sql #sql-server #tsql

#sql #sql-server #tsql

Вопрос:

В текущем запросе я должен указать месяц 0, месяц 1, месяц 2, месяц 3… до месяца 18. как вы можете видеть, есть ли какой-либо способ изменить этот запрос таким образом, чтобы он автоматически вычислял разницу в месяце между оплаченной датой и открытой датой, а затем заполнял столбец суммой суммы платежа за этот месяц. ТАКИМ образом, он не будет ограничен 18 месяцем и будет автоматически создавать и заполнять значение до месяца n без указания месяцев.

 SELECT        
[loan_number], 
acctrefno, 
open_date/*FORMAT(CAST(op.open_date as date), 'yyyy-MM') AS year_month,*/ 
, [Month -1] = IsNull([-1], 0)
, [Month 0] = IsNull([0], 0)
, [Month 1] = IsNull([1], 0)
, [Month 2] = IsNull([2], 0), 
    [Month 3] = IsNull([3], 0)
     , [Month 4] = IsNull([4], 0)
     , [Month 5] = IsNull([5], 0)
         , [Month 6] = IsNull([6], 0)
         , [Month 7] = IsNull([7], 0)
         , [Month 8] = IsNull([8], 0)
         , [Month 9] = IsNull([9], 0)
         , [Month 10] = IsNull([10], 0)
         , [Month 11] = IsNull([11],  0)
         , [Month 12] = IsNull([12], 0), [Month 13] = IsNull([13], 0), [Month 14] = IsNull([14], 0), [Month 15] = IsNull([15], 0), [Month 16] = IsNull([16], 0), [Month 17] = IsNull([17], 0), [Month 18] = IsNull([18], 0)
/*,[Month 70] = IsNull([70],0)*/ 

FROM 
(SELECT       
 L.loan_number
 , l.acctrefno/*, FORMAT(CAST(l.open_date as date), 'yyyy-MM') AS open_date*/ 
 , format(cast(l.open_date AS date), 'MM/dd/yyyy', 'en-US') AS open_date/*, */ , 
                                                                                                                                                                                                                 Item = DateDiff(WEEK, [open_date], [datepaid]), Value = [tot_receipts]
                                                                               
     FROM  
     [NLS].[dbo].loanacct L 
     INNER JOIN
     [NLS].[dbo].[loanacct_detail] LD1 ON LD1.acctrefno = L.acctrefno 
     LEFT JOIN
    [NLS].[dbo].OwnPayments_2 OP ON L.acctrefno = OP.acctrefno
 WHERE        /*p(ayment_type = 'zz' or payment_type IS NULL) AND */ L.portfolio_code_id = 11/*AND l.loan_type = 0*/ ) src 
 PIVOT (sum(Value) FOR Item IN ([-1], [0], [1], [2], [3], [4], [5], [6], [7], [8], [9], [10], 
                         [11], [12], [13], [14], [15], [16], [17], [18])) pvt
 

Комментарии:

1. Если вы не используете динамический sql, нет. Подумайте о том, что вы спрашиваете; столбцы результирующего набора похожи на свойства объекта. Они не меняются динамически время от времени. В вашем автомобиле нет кондиционера в один прекрасный день, а не на следующий, но на следующий день после этого круиз-контроль, затем через 2 дня его заменяют на крышу луны. Почему важно, чтобы столбцы не изменялись динамически? Поскольку обычно интерфейс должен быть перекомпилирован, чтобы справиться с этим .. Вы пытаетесь выполнить в серверной части то, что на самом деле является задачей интерфейса; база данных должна предоставлять строки, интерфейс должен их сопоставлять / сводить

2. Спасибо за вашу информацию.