如何在Access的pivot交叉表查询中按先入顺序填充job对应的options列
实现方案
步骤1:给同Job下的Options按先入顺序编序号
首先新建查询qry_JobOptionsWithSeq,给每个job对应的options按入库顺序生成连续序号,你可以用自增ID、创建时间等能代表先入顺序的字段做排序依据:
SELECT t1.job, t1.Options, (SELECT COUNT(*) FROM 替换为你的子表实际名称 t2 WHERE t2.job = t1.job AND t2.排序字段 <= t1.排序字段) AS Seq FROM 替换为你的子表实际名称 t1 ORDER BY t1.job, t1.排序字段;
提示:把上述代码里的
替换为你的子表实际名称改成你存job和Options的子表名,排序字段换成你能代表先入顺序的字段(比如自增主键ID、入库时间字段等)即可。
步骤2:按序号横向拼接Options
新建第二个查询,按job分组后按序号匹配对应Options,最多50个Option就写到Seq=50即可:
SELECT job, MAX(IIF(Seq=1, Options, NULL)) AS Option1, MAX(IIF(Seq=2, Options, NULL)) AS Option2, MAX(IIF(Seq=3, Options, NULL)) AS Option3, -- 按上述格式补充到Seq=50即可 MAX(IIF(Seq=50, Options, NULL)) AS Option50 FROM qry_JobOptionsWithSeq GROUP BY job;
如果不想单独保存第一个查询,也可以用嵌套查询合并为单条SQL:
SELECT t.job, MAX(IIF(t.Seq=1, t.Options, NULL)) AS Option1, MAX(IIF(t.Seq=2, t.Options, NULL)) AS Option2, -- 补充到Seq=50 MAX(IIF(t.Seq=50, t.Options, NULL)) AS Option50 FROM ( SELECT t1.job, t1.Options, (SELECT COUNT(*) FROM 替换为你的子表实际名称 t2 WHERE t2.job = t1.job AND t2.排序字段 <= t1.排序字段) AS Seq FROM 替换为你的子表实际名称 t1 ) AS t GROUP BY t.job;
效果说明
- 同一个job下的所有Options会按先入顺序依次填充Option1、Option2...的空位,空值自动留空
- 同job下重复的Options标签也会按顺序完整保留,不会被合并
- 不需要设置交叉表的列头匹配规则,也不会出现Options被强制归到同一列的问题
样例参考

内容的提问来源于stack exchange,提问作者Mike Condon
相关产品推荐
相关产品推荐

