SQL - 使用空值替换重复的行,同时保留行数

时间:2013-12-12 22:51:38

标签: sql sql-server-2008

我试图只获得一年中的一个实例而不是12个,因为我在查找表中使用此列来为报表提供参数。因为我使用的是月度和年度数据,所以我试图将它们都放在同一个表中。

我有一张这样的表

--Date--------Year
-------------------- 
1/2012-------2012 
2/2012-------2012 
3/2012-------2012 
4/2012-------2012 
5/2012-------2012 
6/2012-------2012 
7/2012-------2012 
8/2012-------2012 
9/2012-------2012 
10/2012------2012 
11/2012------2012 
12/2012------2012 
1/2013-------2013 
2/2013-------2013 

这是我想要的表

--Date--------Year 
-------------------- 
1/2012-------2012 
2/2012-------null 
3/2012-------null 
4/2012-------null 
5/2012-------null 
6/2012-------null 
7/2012-------null 
8/2012-------null 
9/2012-------null 
10/2012------null 
11/2012------null 
12/2012------null 
1/2013-------2013 
2/2013-------null 

有人能告诉我如何解决这样的问题吗?

我现在使用的代码是

SELECT     CAST(MONTH(rmp.EcoDate) AS Varchar(2)) + '/' + CAST(YEAR(rmp.EcoDate) AS varchar(4)) AS Date, Year(rmp.EcoDate) as EcoYear
FROM         PhdRpt.ReportCaseList_542 AS rcl INNER JOIN
                      CaseCases AS cc ON rcl.CaseCaseId = cc.CaseCaseId INNER JOIN
                      PhdRpt.RptMonthlyProduction_542 AS rmp ON rcl.ReportRunCaseId = rmp.ReportRunCaseId`
GROUP BY rmp.EcoDate

1 个答案:

答案 0 :(得分:1)

您可以通过枚举一年内的行来完成此操作。然后更新除第一个之外的所有内容:

with toupdate as (
      select t.*, row_number() over (partition by [year] order by [date]) as seqnum
      from t
     )
update toupdate
    set [year] = NULL
    where seqnum > 1;

如果您希望将其作为select声明:

with ts as (
      select t.*, row_number() over (partition by [year] order by [date]) as seqnum
      from t
     )
select [date],
       (case when seqnum = 1 then [year] end) as [year]
from ts;