T-SQL获取3个月的时间间隔:尝试在close_dt Interval

时间:2017-04-07 15:46:47

标签: sql sql-server sql-server-2008 tsql sql-server-2012

尝试在close_dt Interval上计算Property_IDs

select distinct pd.state AS StateName, zw.CountyName AS [County Name]
,sum(case when pc.close_dt >= dateName(MM,dateadd(MM,-3,GetDate()))then 1 
else 0 end) AS [0-3 Months]
,sum(case when pc.close_dt >= dateName(MM,dateadd(MM,-6,GetDate())) 
                and pc.close_dt < dateName(MM,dateadd(MM,-3,GetDate())) then 
1 else 0 end) AS [3-6 Months]  
 from resnet_mysql.dbo.property_details pd (Nolock)
join resnet.dbo.ZipCodesView zw (nolock)
    on CAST(LEFT(pd.zip, 5) AS varchar) = CAST(zw.ZipCodeID AS varchar)
join resnet_mysql.dbo.property_closings pc (nolock)
    on pd.property_id = pc.property_id
group by pd.state, zw.countyName, pc.close_dt

如何获得前3个月间隔值的3个月间隔?那么这将是3-6个月?

我希望它看起来像这样。

enter image description here

但是我收到了这个错误。

enter image description here

1 个答案:

答案 0 :(得分:1)

我想你想要这样的东西:

select pd.state AS StateName, zw.CountyName AS [County Name],
       sum(case when pc.close_dt >= dateadd(month, -3, GetDate()) then 1 
                else 0
           end) AS [0-3 Months]
       sum(case when pc.close_dt >= dateadd(month, -6, GetDate()) and
                     pc.close_dt < dateadd(month, -3, GetDate())
                then 1
                else 0
           end) AS [3-6 Months]  
from resnet_mysql.dbo.property_details pd join
     resnet.dbo.ZipCodesView zw 
     on LEFT(pd.zip, 5) = CAST(zw.ZipCodeID as VARCHAR(5)) join
     resnet_mysql.dbo.property_closings pc 
     on pd.property_id = pc.property_id
group by pd.state, zw.countyName;

您的原始代码有很多错误,很难列出它们:

  • DATENAME()返回一个字符串。你为什么要把它与日期进行比较?
  • 您正在根据日期范围进行汇总。您不希望在GROUP BY
  • 中加入日期
  • LEFT()已经返回一个字符串;没有必要转换它。
  • 您可能不想将字符串版本的邮政编码与数字ID进行比较。但是如果你这样做,转换应该指定长度。
  • 除非您确实知道自己在做什么,否则不建议使用
  • WITH (NOLOCK)