【问题标题】:Default the year based on month value根据月份值默认年份
【发布时间】:2015-09-07 18:45:04
【问题描述】:

我有一个查询来显示表中的年份值并默认为当前年份。

select distinct year(startdate) as syear, year(startdate) as eyear, 1 as sOrder from [TTS].[dbo].[Class] where year(startdate) <> year(getdate())
    union all
    select year(getdate()) as syear, year(getdate()) as eyear, 0 as sOrder
    order by sOrder asc, syear desc

这里的默认年份是 2015 年(Sorder 0)。现在我需要根据月份值显示默认年份。例如,如果年份是 2015 年,月份是 1 月、2 月、3 月、4 月,则默认年份是 2015 年。否则默认年份是 2016 年。我尝试了以下查询

select distinct year(startdate) as syear, year(startdate) as eyear, 1 as sOrder  from [TTS].[dbo].[Class]  where
 year(startdate) <> year(getdate())
union all
select year(getdate())+1 as syear, year(getdate())+1 as eyear, 0 as sOrder where month(getdate()) not in(1,2,3,4) 
union all
select year(getdate()) as syear, year(getdate()) as eyear, 0 as sOrder where month(getdate())in(1,2,3,4)

order by sOrder asc, syear desc

但是年份值正在重复。有什么可以帮助我的吗?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    SQL Server 的操作是正确的,因为您请求返回额外的行,如果现在运行 2015-06-22 将返回“2016” 您的 distinct 仅适用于您所做的第一个选择,因此这些是您的选择:

    1) 将 cte 与 distincts 一起使用

    with subq1 (syear, eyear, sOrder) as (select year(getdate())+1 as syear, year(getdate())+1 as eyear, 0 as sOrder where month(getdate()) not in(1,2,3,4) 
    union all
    select year(getdate()) as syear, year(getdate()) as eyear, 0 as sOrder where month(getdate())in(1,2,3,4)),
    subq2 as (select distinct year(startdate) as syear, year(startdate) as eyear, 1 as sOrder  from [TTS].[dbo].[Class])
    
    Select distinct syear, eyear, sOrder
    from subq1
    UNION ALL
    select syear, eyear, sOrder
    from subq2 s2
    where s2.syear <> (select syear from subq1)
    
    order by sOrder asc, syear desc
    

    可以在此处找到用于此的 SQL Fiddle:http://sqlfiddle.com/#!6/f89b3a/3/0

    2) 你可以尝试使用分组:

    select distinct syear, eyear, min(sOrder)
    from
    (select distinct year(startdate) as syear, year(startdate) as eyear, 1 as sOrder 
    from [TTS].[dbo].[Class]
    union all
    select year(getdate())+1 as syear, year(getdate())+1 as eyear, 0 as sOrder where month(getdate()) not in(1,2,3,4) 
    union all
    select year(getdate()) as syear, year(getdate()) as eyear, 0 as sOrder where month(getdate())in(1,2,3,4)) subq
    
    Group by syear, eyear
    order by min(sOrder) asc, syear desc
    

    可以在此处找到用于此的 SQL Fiddle:http://sqlfiddle.com/#!6/f89b3a/5/0

    我个人会推荐选项 1 而不是选项 2。

    【讨论】:

    • 我尝试了你的建议 1 。但我得到重复的结果。年订单 2016 2016 0 2016 2016 1 2014 2014 1 2013 2013 1 2012 2012 1 2011 2011 1 2010 2010 1 2009 2009 1 2008 2008 1 1900 190.在第二行中,需要 2015 年而不是 2016 年。有什么办法吗?
    • 他们有不同的sOrder吗?
    • 默认年份为0,否则为1
    • 您的开始日期必须是 2016 年,这是导致问题的原因。
    • 混合了我的表格,现在应该可以使用更新的表格了。
    【解决方案2】:

    您可以使用UNION 而不是UNION ALL 来排除重复项:

    SELECT  YEAR(startdate) AS syear ,
            YEAR(startdate) AS eyear ,
            1 AS sOrder
    FROM    [TTS].[dbo].[Class]
    WHERE   YEAR(startdate) <> YEAR(GETDATE())
    UNION
    SELECT  YEAR(GETDATE()) + 1 AS syear ,
            YEAR(GETDATE()) + 1 AS eyear ,
            0 AS sOrder
    WHERE   MONTH(GETDATE()) NOT IN ( 1, 2, 3, 4 )
    UNION
    SELECT  YEAR(GETDATE()) AS syear ,
            YEAR(GETDATE()) AS eyear ,
            0 AS sOrder
    WHERE   MONTH(GETDATE()) IN ( 1, 2, 3, 4 )
    ORDER BY sOrder ASC ,
            syear DESC
    

    【讨论】:

      【解决方案3】:

      用下面的代码替换你的代码(你试图找到当前年份的地方)应该可以工作。

      SELECT YEAR(DATEADD(MM,-4,GETDATE())) + 1
      
      like 
      
      
      SELECT DISTINCT year(startdate) AS syear
          ,year(startdate) AS eyear
          ,1 AS sOrder
      FROM [TTS].[dbo].[Class]
      WHERE year(startdate) <> year(getdate())
      
      UNION ALL
      
      SELECT YEAR(DATEADD(MM, - 4, GETDATE())) + 1 AS syear
          ,YEAR(DATEADD(MM, - 4, GETDATE())) + 1 AS eyear
          ,0 AS sOrder
      ORDER BY sOrder ASC
          ,syear DESC
      

      【讨论】:

        猜你喜欢
        • 2021-11-25
        • 2019-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-24
        • 2018-03-02
        • 2016-11-05
        相关资源
        最近更新 更多