2012-09-05 51 views
0

在我的情况下,我有三个表。合同表,协议表和付款表。我所拥有的是一张表格,其中包含代表债务价值的合同,另一个表格中包含偿还债务的条件,另一个表格与协议表格有关,债务分成包裹。查询显示相关表的具体数值

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 Server。

在此先感谢!

+0

你能提供一个你想要的数据和结果的例子吗? –

回答

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

我用“分”为下一步付款日期假设有多个下付款日期。

SQL Fiddle

+0

这几乎是我所需要的,问题是因为它显示所有付款日期... – Miguel

+0

根据您的样本数据,您的预期结果是什么? –

+0

我需要得到所有没有任何相关协议的合同。我只得到那些有积极协议的人。我正在使用MS Sql Server 2012,正如我所说的查询不会提供与SQL小提琴相同的结果。 – Miguel

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