访问查询:按逻辑而不是字母顺序对日期进行排序
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;
作为数据表的结果是这样的:
- 上面代表的月份是:12-14、1-15、2-15、3-15
- 查询 grouped/sorted 所依据的 [Closing Date] 字段是格式为 m/d/yyyy 的 Date/Time 字段(例如 12/1/2014 或 3/26/2015 )
如您所见,月份是按字母顺序排序的,而不是按逻辑排序的。有谁能建议我如何修改我的 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;
备注:
DISTINCTROW
在 GROUP BY
查询中没有用,因为根据定义,查询的输出行已经是唯一的。
- 您可以使用另一个
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')
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
- 查询 grouped/sorted 所依据的 [Closing Date] 字段是格式为 m/d/yyyy 的 Date/Time 字段(例如 12/1/2014 或 3/26/2015 )
如您所见,月份是按字母顺序排序的,而不是按逻辑排序的。有谁能建议我如何修改我的 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;
备注:
DISTINCTROW
在GROUP BY
查询中没有用,因为根据定义,查询的输出行已经是唯一的。- 您可以使用另一个
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')