2012-02-28 59 views
-2

有一个表如下: 客户ID,MDN,计划开始日期,结束日期,期限,期限计数,短信的使用,语音使用添加期限计数基于我多少记录和日期

有可能是记录,其中客户ID显示出来一次或更多 -

如果有客户ID只有一个实例,我想长期计数为1 -

如果客户ID显示了不止一次,我要按开始日期排序所有记录 - 并在开始日期后按每条记录递增期限计数 -

如果客户ID是34,并且开始日期和1/1/2012和2012/2/2

第一个应该被设置为1,第二个应该被设置为2 -

SAS

回答

3

因为我们现在知道这是SQL Server 2008中,没有SQL Server 2000作为原标签,我们可以这样做:

SELECT CustomerID, StartDate, TermCount = ROW_NUMBER() 
    OVER (PARTITION BY CustomerID ORDER BY StartDate) 
    FROM dbo.table 
    ORDER BY CustomerID, StartDate; 

编辑添加upda基于关于换档要求的新信息进行查询。

;WITH t AS 
(
    SELECT CustomerID, StartDate, CountColumn, TermCount = ROW_NUMBER() 
     OVER (PARTITION BY CustomerID ORDER BY StartDate) 
     FROM dbo.table 
) UPDATE t SET CountColumn = TermCount; 

但是正如我在评论所说,这是不明智的,因为你需要不断更新整个表(或至少为客户整套行)每当任何行对于客户的变化。只需基于上述SELECT查询创建视图,而不是尝试存储数据。


如果其他用户遇到同样的问题并且由于某种原因仍在运行SQL Server 2000,请在此处留下2000解决方法。如果你的桌子很大,这将会非常缓慢。

SELECT CustomerID, StartDate, TermCount = (
    SELECT COUNT(*) FROM dbo.table AS t2 
    WHERE t.CustomerID = t2.CustomerID 
    AND t.StartDate <= t2.StartDate 
) 
FROM dbo.table AS t 
ORDER BY CustomerID, StartDate; 
+0

即时运行SQL服务器2008年 - 抱歉的混淆 – 2012-02-28 17:44:47

+0

@Sarfaraz为什么你被标记为SQL Server 2000?这是现在的两个问题,因为你说你在SQL Server 2000上执行额外的工作。 – 2012-02-28 17:50:21

+0

我必须仔细观察,我以为我选择了SQL Server 2008两次! - – 2012-02-28 17:57:02