【问题标题】:Access query: Sort date logically, not alphabetically访问查询:按逻辑排序日期,而不是按字母顺序
【发布时间】:2015-03-12 19:20:23
【问题描述】:

查询的 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;

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

  • 上面表示的月份是:12-14、1-15、2-15、3-15
  • 对查询进行分组/排序的 [Closing Date] 字段是日期/时间字段,格式为 m/d/yyyy(例如 12/1/2014 或 3/26/2015)

如您所见,月份是按字母顺序排列的,而不是按逻辑排列的。有没有人能建议我如何修改我的 SQL 以使查询按日期格式 mm (数字格式的月份)分组/排序,但在数据表/报告中显示为 mmmm(文本中的月份名称)。

【问题讨论】:

    标签: sql ms-access ms-access-2010 jet


    【解决方案1】:

    将当月第一天的字段表达式添加到您的 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. DISTINCTROW 在 GROUP BY 查询中没有用处,因为根据定义,查询的输出行已经是唯一的。
    2. 您可以使用另一个Format 表达式来代替我建议的DateSerial 表达式,例如Format(ca.[Closing Date], "yyyymm") AS YearMonth

    【讨论】:

    • 不客气。 Year(ca.[Closing Date])*12+DatePart('m',ca.[Closing Date])-1 让我感到困惑。但既然你似乎对它给你的东西感到满意,我想如果我不理解它,我们会没事的。 :-)
    • 这不是我手动输入的。我最初使用查询向导创建了查询,它是作为 Group By 语句的一部分自动生成的。我同样感到困惑:)
    • 啊哈!在这种情况下,如果您删除那个令人费解的部分,查询是否正常工作? (我怀疑它没用。)
    • 好的,我会从我的回答中删除那个“令人费解的部分”。如果你想通过HAVING 子句评估[Disputed],你必须GROUP BY 它。但我不确定这是必要的。您可以将该条件包含在 WHERE 子句中,这与您在评论中描述的方式非常相似:WHERE ca.[Disputed] = True
    • 这就是我的意思,呵呵!谢谢。顺便说一句,您的代码在 Month_Start 之后缺少一个逗号。
    【解决方案2】:

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

    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')
    

    【讨论】:

      猜你喜欢
      • 2021-03-27
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 2022-11-13
      • 1970-01-01
      • 2015-06-20
      相关资源
      最近更新 更多