Access中按请求编号分组并拆分数据至多列的实现方案求助
解决Access中按请求分组并提取重发信息的问题
针对你需要按REQUEST #分组,提取初始发送日期、重发次数及各次重发日期的需求,我们可以通过带子查询的聚合SQL语句来实现,完全适配Access的语法环境。
核心思路
- 每个请求组的初始发送日期是该组中最早的
DATE_SENT,用MIN()函数获取。 - 重发次数等于该组的总记录数减1(因为第一条是初始请求),用
COUNT(*) - 1计算。 - 给每个请求组内的记录按发送日期排序,标记序号(初始请求为1,第一次重发为2,以此类推),再通过条件聚合提取对应序号的日期作为重发日期列。
完整SQL语句
请将下面的YourTableName替换为你实际的表名:
SELECT t.REQUEST_#, MIN(t.DATE_SENT) AS DATE_SENT_ORI, COUNT(*) - 1 AS #_OF_REL, MAX(IIF(r.Rank = 2, t.DATE_SENT, NULL)) AS REL1_DATE, MAX(IIF(r.Rank = 3, t.DATE_SENT, NULL)) AS REL2_DATE, MAX(IIF(r.Rank = 4, t.DATE_SENT, NULL)) AS REL3_DATE, MAX(IIF(r.Rank = 5, t.DATE_SENT, NULL)) AS REL4_DATE FROM YourTableName t INNER JOIN ( -- 子查询:给每个请求组内的记录按发送日期排序生成序号 SELECT REQUEST_#, DATE_SENT, (SELECT COUNT(*) FROM YourTableName WHERE REQUEST_# = t1.REQUEST_# AND DATE_SENT <= t1.DATE_SENT) AS Rank FROM YourTableName t1 ) r ON t.REQUEST_# = r.REQUEST_# AND t.DATE_SENT = r.DATE_SENT GROUP BY t.REQUEST_#
语句解释
- 子查询
r:为每个REQUEST #下的记录生成Rank序号,序号按DATE_SENT从小到大排序,初始请求的Rank为1,第一次重发为2,第二次重发为3,以此类推。 - 主查询:
MIN(t.DATE_SENT):提取该请求组的最早发送日期(即初始请求日期)。COUNT(*) - 1:计算重发次数(总记录数减去初始请求的1条)。MAX(IIF(r.Rank = n, t.DATE_SENT, NULL)):通过条件判断提取对应Rank的日期,MAX()确保在分组后只保留该Rank对应的唯一日期,没有对应重发时返回NULL。
适配你的示例数据
运行上述语句后,会得到你期望的结果:
| REQUEST_# | DATE_SENT_ORI | #_OF_REL | REL1_DATE | REL2_DATE | REL3_DATE | REL4_DATE |
|---|---|---|---|---|---|---|
| 1 | 01-01-18 | 1 | 01-06-18 | NULL | NULL | NULL |
| 2 | 01-07-18 | 2 | 01-10-18 | 01-14-18 | NULL | NULL |
注意事项
- 如果你的
DATE_SENT是文本类型,请确保日期格式是可排序的(比如MM-DD-YY在Access中如果被识别为日期类型则没问题,若为纯文本建议转换为日期类型后再查询)。 - 若重发次数最多为5次,上述语句已经覆盖到第4次重发(对应Rank=5),如果需要更多重发日期列,只需继续添加
MAX(IIF(r.Rank = 6, t.DATE_SENT, NULL)) AS REL5_DATE这类语句即可。
内容的提问来源于stack exchange,提问作者Jayme_123
相关产品推荐
相关产品推荐

