0

私の場合、3 つのテーブルがあります。契約テーブル、契約テーブル、支払いテーブル。私が持っているのは、負債の価値を表す契約のテーブル、負債を返済する条件の合意を含む別のテーブル、および区画に分割された債務を持つ契約テーブルに関連する別のテーブルです。

ContractsTable
(Id | Number |  Name  |    Debt   | ...)
 1  |  1234  | AAAAAA | 1250,00 € | ...
 2  |  1235  | BBBBBB | 5000,20 € | ...
 3  |  1236  | CCCCCC | 500,00 €  | ...

AgreementsTable
(Id | ContractId |    Debt   | IsValid | ...)
 1  |     1      | 1250,00 € |    1    | ...
 2  |     2      | 5000,20 € |    0    | ...
 3  |     2      | 5000,20 € |    1    | ...
 4  |     3      | 500,00 €  |    0    | ...

PaymentsTable
(Id  | AgreementId |    Date    |  Amount   | IsPaid | ...)
  1  |      1      | 01/08/2012 | 500,00 €  |   1    | ...
  2  |      1      | 01/09/2012 | 500,00 €  |   1    | ... -> Last payment
  3  |      1      | 01/10/2012 | 250,00 €  |   0    | ... -> Next Payment
  4  |      3      | 01/08/2012 | 1000,00 € |   1    | ...
  5  |      3      | 01/09/2012 | 1000,00 € |   1    | ...
  6  |      3      | 01/10/2012 | 1000,00 € |   0    | ...
  7  |      3      | 01/11/2012 | 1000,00 € |   0    | ...
  8  |      3      | 01/12/2012 | 1000,20 € |   0    | ...

そのため、ストアド プロシージャを実行して契約を含むテーブルを取得するときに、最後に行われた支払いの日付と次の支払いの日付も列に表示したいと考えています。しかし、契約に関連する有効な契約がある場合にのみ、契約が有効な場合にのみ、最後の支払いの日付と次の支払いの日付を確認できます。

私はMS Sqlサーバーを使用しています。

前もって感謝します!

4

2 に答える 2

2

これはうまくいきますか?

select aa.Id
        , aa.Number
        , aa.Name
        , aa.Debt
        ...
        , max(aa.Date_LastPayment) as Date_LastPayment
        , min(aa.Date_NextPayment) as Date_NextPayment
from    
(       
    select a.Id
            , a.Number
            , a.Name
            , a.Debt
            ...
            , case when c.IsPaid = 1 then c.[Date]
                    else null
                    end as Date_LastPayment
            , case when c.IsPaid = 0 then c.[Date]
                    else null
                    end as Date_NextPayment
    from ContractsTable a
    inner join AgreementsTable b on b.ContractId = a.Id
    inner join PaymentsTable c on c.AgreementId = b.Id
    where b.IsValid = 1
) aa
group by aa.Id
            , aa.Number
            , aa.Name
            , aa.Debt
            ...

次の支払い日が複数あると仮定して、次の支払い日に「min」を使用しました。

SQL フィドル

于 2012-09-05T22:40:30.563 に答える
0

Max(PaymentsTable.Date) は探しているものではありません。
前回の支払い日と次回の支払い日をより適切に定義してください

select ContractsTable.Id,  ContractsTable.Number, ContractsTable.Debt 
, count(AgreementsTable.ID) as 'NumAgreements'
, max(PaymentsTable.Date) 
from ContractsTable 
left outter join AgreementsTable 
on ContractsTable.ID = AgreementsTable.ID 
left outter join PaymentsTable 
on ContractsTable.ID = PaymentsTable.ID
group by ContractsTable.Id,  ContractsTable.Number, ContractsTable.Debt
于 2012-09-05T22:08:09.523 に答える