【问题标题】:How to order by Month starting from a selected Month in SQL?如何从 SQL 中选定的月份开始按月份排序?
【发布时间】:2021-09-28 08:17:34
【问题描述】:

我有一个包含代码和描述列的表格。 Description 列包含按连续顺序排列的一年中的月份,code 为月份编号(例如 Code = 1,Description = 一月)。

我想编写一个 SQL 查询,它获取上个月(从当月开始)并返回一个从该月开始的表并按升序对月份进行排序(上个月是 8 月,因此该表将从 8 月开始第 1 行,代码为 8,接下来是 9 月、9 日等)

到目前为止我的代码:

DECLARE @PreviousMonth INT = MONTH(DATEADD(mm, -1, GETDATE()))
SELECT @PreviousMonth
SELECT
     MonthNumber AS Code,
     MonthName AS Description
FROM
    MonthName
ORDER BY MONTH(DATEADD(mm, -1, GETDATE()))

因此,如果当前月份是 9 月,则 8 月将是上个月。

预期结果(左侧代码,右侧描述):

8 August
9 September 
10 October
11 November
12 December
1 January
2 February
3 March
4 April
5 May
6 June
7 July

【问题讨论】:

  • 我认为你描述的不是ordering,而是renumbering
  • 我认为这是 Microsoft SQL-Server?您将需要一个 where 子句来获取起始月份,例如 WHERE MonthNumber>= @previousMonth。另外,为什么不简单地按 MonthNumber 排序?
  • 您能否将您的预期查询结果添加到您的问题中。
  • 添加了预期的查询结果
  • DATEADD(mm, ...DATEADD(month, ... 相比,您节省了多少精力?后者的可读性高多少?

标签: sql sql-server tsql


【解决方案1】:
ORDER BY
  MonthNumber + CASE WHEN MonthNumber < @PreviousMonth THEN 12 ELSE 0 END

【讨论】:

    【解决方案2】:

    如果我理解正确,您需要能够选择一个范围,它将“循环”到开始。

    一种方法是将您的月份表合并以生成 1-23 的列表:

        declare @PreviousMonth int = Month(DateAdd(mm, -1, GetDate()));
    
        with m as (
            select code, description 
            from t 
            union all
            select code+12, description 
            from t
        )
        select Iif(m.code>12, m.code % 12,code) code, m.description
        from m
        where m.code between @PreviousMonth and @PreviousMonth+11
        order by m.code
    

    Demo DB<>Fiddle

    【讨论】:

      猜你喜欢
      • 2014-01-25
      • 2019-08-18
      • 1970-01-01
      • 2016-10-21
      • 2019-11-09
      • 1970-01-01
      • 2021-01-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多