访问查询:按逻辑而不是字母顺序对日期进行排序

Access query: Sort date logically, not alphabetically

SQL查询为:

SELECT DISTINCTROW Format$([Client Accounting].[Closing Date],'mmmm') AS [Month], Count([Client Accounting].[Loan Number]) AS [DB Error #], Sum([Client Accounting].[Write Off]) AS [Write Off], Sum([Client Accounting].Refund) AS Refund
FROM [Client Accounting]
GROUP BY Format$([Client Accounting].[Closing Date],'mmmm'), Year([Client Accounting].[Closing Date])*12+DatePart('m',[Client Accounting].[Closing Date])-1
ORDER BY Format$([Client Accounting].[Closing Date],'mmmm'), Year([Client Accounting].[Closing Date])*12+DatePart('m',[Client Accounting].[Closing Date])-1;

作为数据表的结果是这样的:

如您所见,月份是按字母顺序排序的,而不是按逻辑排序的。有谁能建议我如何修改我的 SQL 以按日期格式 mm(数字格式的月份)进行查询 grouped/sorted,但显示在datasheet/report as mmmm(文本中的月份名称)。

将一个月第一天的字段表达式添加到您的 SELECT 列表和 GROUP BY 子句中。

DateSerial(Year([Closing Date]), Month([Closing Date]), 1) AS Month_Start

然后你可以ORDER BY那个计算字段。

如果您不希望该字段出现在查询输出中,您可以在子查询中使用它 --- 计算字段可以用于 ORDER BY 但可以从父查询中排除查询的 SELECT 列表。

SELECT
    sub.Month,
    sub.[DB Error #],
    sub.[Write Off],
    sub.Refund
FROM
(
    SELECT
        DateSerial(Year(ca.[Closing Date]), Month(ca.[Closing Date]), 1) AS Month_Start,
        Format$(ca.[Closing Date],'mmmm') AS [Month],
        Count(ca.[Loan Number]) AS [DB Error #],
        Sum(ca.[Write Off]) AS [Write Off],
        Sum(ca.Refund) AS Refund
    FROM [Client Accounting] AS ca
    GROUP BY
        DateSerial(Year(ca.[Closing Date]), Month(ca.[Closing Date]), 1),
        Format$(ca.[Closing Date],'mmmm')
    ) AS sub
ORDER BY sub.Month_Start;

备注:

  1. DISTINCTROWGROUP BY 查询中没有用,因为根据定义,查询的输出行已经是唯一的。
  2. 您可以使用另一个 Format 表达式代替我建议的 DateSerial 表达式,例如 Format(ca.[Closing Date], "yyyymm") AS YearMonth

如果您的原始查询除了排序之外都有效,您只需要按月优先分组即可:

SELECT 
    Format([Client Accounting].[Closing Date],'mmmm') AS [Month], 
    Count([Client Accounting].[Loan Number]) AS [DB Error #], 
    Sum([Client Accounting].[Write Off]) AS [Write Off], 
    Sum([Client Accounting].Refund) AS Refund
FROM 
    [Client Accounting]
GROUP BY 
    DateSerial(Year([Client Accounting].[Closing Date]), Month([Client Accounting].[Closing Date], 1),
    Format([Client Accounting].[Closing Date],'mmmm')