使用日期的案例陈述

时间:2015-04-02 17:14:28

标签: sql sql-server sql-server-2008

我有一组客户端数据。每个都有一个开始日期和结束日期。客户可以拥有多条具有不同开始日期和结束日期的行。我有另一个包含索赔信息的数据集,我想知道他们是否在状态和结束日期的时间范围内提出了索赔。

我怎么写这个?

 SELECT 
   M.[ID]
  ,EN.StartDate
  ,EN.EndDate
  ,[Has Cliams History] (Column to identify if yes or no)  

 FROM [Test].[dbo].[tblClients] M
 left join [test].[dbo].[tblCliams] EN on EN.ID = M.ID

2 个答案:

答案 0 :(得分:0)

为了说明case语句的使用,ClaimDate字段表示声明的日期。查询看起来像这样。

SELECT 
   M.[ID]
  ,EN.StartDate
  ,EN.EndDate
  ,CASE  
         WHEN ClaimDate between EN.StartDate AND EN.EndDate THEN 'yes' 
         ELSE 'no' 
       END [Has Cliams History]
 FROM [Test].[dbo].[tblClients] M
 left join [test].[dbo].[tblClaims] EN on EN.ID = M.ID

答案 1 :(得分:0)

您的问题需要更清晰地说明两个表的定义以及两者之间的关系。我猜你实际上并没有加入一个名为ID的列(至少我希望不会)。基于假设您在tblClaims上有ClientID并且您通过NULL EndDate支持正在进行的客户端,这是对它的抨击。还假设在tblClaims上有开始日期和结束日期。

SELECT M.[ID]
    , CASE WHEN MAX(claim.ID) IS NOT NULL THEN 1 ELSE 0 END AS HasClaimsHistory
FROM [Test].[dbo].[tblClients] client
LEFT JOIN [Test].[dbo].[tblCliams] claim on client.ID = claim.ClientID
    AND claim.StartDate >= client.StartDate
    AND (
        client.EndDate IS NULL /* ongoing support? */
        OR 
        claim.EndDate <= client.EndDate
    )
GROUP BY M.[ID]
    , CASE WHEN MAX(claim.ID) IS NOT NULL THEN 1 ELSE 0 END