Access SQL需求:按设备编号和日期对优先级Q分组计数
解决Access中按设备和优先级的日期递增计数问题
嘿,作为SQL新手碰到这种分组排序计数的需求很正常,我来帮你捋清楚怎么搞定这个问题!
首先先说说你之前写的语句为什么返回-1:你的子查询里SERVICES.ID=ID存在字段歧义(Access会把ID当成子查询里SVC表的ID,而非外部的SERVICES.ID),而且And [SERVICES].[PRIORITY]="Q"的位置完全错了——你把它跟子查询结果用And连在一起,这会让整个表达式变成布尔判断(符合条件返回-1,不符合返回0),这显然不是你要的计数效果。
正确的实现思路
我们需要的是:对每个设备编号下优先级为"Q"的记录,按日期从早到晚给每条记录分配递增的序号,切换设备后重新从1开始。在Access SQL里,我们可以用关联子查询来实现这个逻辑——统计当前记录之前(包括自身),同设备、同优先级"Q"且日期不晚于当前记录的总条数,这个条数就是我们要的序号。
最终SQL语句
SELECT SERVICES.设备编号, SERVICES.PRIORITY, SERVICES.日期, -- 计算当前记录在同设备同优先级Q中的序号 (SELECT COUNT(*) FROM SVC AS S WHERE S.设备编号 = SERVICES.设备编号 AND S.PRIORITY = "Q" AND S.日期 <= SERVICES.日期) AS 序号 FROM SVC AS SERVICES WHERE SERVICES.PRIORITY = "Q" -- 只保留优先级为Q的记录 ORDER BY SERVICES.设备编号, SERVICES.日期;
语句说明
- 外层查询筛选出所有优先级为"Q"的记录,按设备编号和日期排序;
- 子查询里:
S.设备编号 = SERVICES.设备编号:确保只统计当前设备的记录;S.PRIORITY = "Q":只统计同优先级的记录;S.日期 <= SERVICES.日期:统计日期早于或等于当前记录的条数,这样最早的日期会得到1,后续依次递增;
- 最终的
序号字段就是你要的按日期排序的计数,切换设备后会自动重新从1开始。
额外注意事项
如果你的数据里存在同一设备、同一优先级、同一日期有多条记录的情况,上面的语句会给这些记录分配相同的序号。如果需要给它们分配不同的序号(比如按ID排序),可以修改子查询的条件,加入ID的判断:
(SELECT COUNT(*) FROM SVC AS S WHERE S.设备编号 = SERVICES.设备编号 AND S.PRIORITY = "Q" AND (S.日期 < SERVICES.日期 OR (S.日期 = SERVICES.日期 AND S.ID <= SERVICES.ID))) AS 序号
内容的提问来源于stack exchange,提问作者PAT
相关产品推荐
相关产品推荐

