MS Access SQL日期字段修改问题及最终可行查询方案
MS Access 日期转换与雷击次数统计问题解决
需求
处理继承数据表,日期与24小时制时间为单独字段:
- 若时间(PDT字段)处于前一日08:00至当日07:59区间,保留当前日期;若时间≥08:00,日期加1
- 将PSA、转换后的日期、雷击次数写入新表
Strikes_08-08
源数据表(PSA_Ltg)
PSA Date GMT PDT polarity lat lon E5 6/28/2023 2130 P 42.33 -119.33 E5 6/28/2023 400 N 42.01 -119.15 E5 6/27/2023 1550 N 42.00 -118.15 E5 6/27/2023 745 P 42.00 -119.61
初始查询与问题
初始查询语句:
SELECT PSA_Ltg.PSA, PSA_Ltg.Date, Switch(PSA_Ltg.[PDT]<800, PSA_Ltg.[Date], PSA_Ltg.[PDT]>=800, PSA_Ltg.[Date]+1) AS NewDate, Count(PSA_Ltg.polarity) AS Strikes INTO [Strikes_08-08] FROM PSA_Ltg GROUP BY PSA_Ltg.PSA, PSA_Ltg.Date;
运行时触发错误:
Your query does not include the specified expression
'Switch(PSA_ltg.[PDT]<0800,PSA_Ltg.[Date],PSA_Ltg.[PDT]>=800,PSA_Ltg.[Date]+1)'
as part of an aggregate function.
移除Switch语句后查询可运行,但丢失日期重分配功能,输出不符合需求:
Strikes_08-08 PSA Date Strikes E5 6/27/2023 2 E5 6/28/2023 1 E5 6/29/2023 1
期望输出
Strikes_08-08 PSA Date Strikes E5 6/27/2023 1 E5 6/28/2023 2 E5 6/29/2023 1
最终可运行查询
SELECT PSA_Ltg.PSA, Switch(PSA_Ltg.[PDT]<800, PSA_Ltg.[Date], PSA_Ltg.[PDT]>=800, PSA_Ltg.[Date]+1) AS NewDate, Count(PSA_Ltg.polarity) AS Strikes INTO [Strikes_08-08] FROM PSA_Ltg GROUP BY PSA_Ltg.PSA, Switch(PSA_Ltg.[PDT]<800, PSA_Ltg.[Date], PSA_Ltg.[PDT]>=800, PSA_Ltg.[Date]+1);
问题原因与解决逻辑
错误根源是:Access的GROUP BY子句必须包含SELECT中所有非聚合函数的字段/表达式。初始查询中SELECT包含计算后的NewDate(Switch表达式),但GROUP BY仅用了原Date字段,导致逻辑不匹配。修改后将Switch表达式直接加入GROUP BY,确保分组依据与输出的日期逻辑一致,即可正确统计。
内容的提问来源于stack exchange,提问作者Jon Bonk
相关产品推荐
相关产品推荐

