18 个月前,我不得不为现实世界的报告应用程序构建 2 个与此类似的查询。这些要求是不寻常的,并且对于一个不寻常的报告环境来说,但仍然是相当理智和明智的。然后将查询的最终产品转入 MS-Access 以进行最终报告和打印。实际上编程很有趣。
使用我最熟悉的 SQL 方言 SQL Server,可以如下构建报表。
请注意,在概述的报告的 30 行中,有 20 行是数据行,10 行是页眉、列标题或页脚行。
- 为按计划 ID 分组的主要数据构建一个查询,该查询将每个字段转换为所需长度的 varchar。
- 在 (1) 上构建一个超级查询,生成单个 65 个字符的文本字符串作为每行输出
- 构建一个超级查询,在 PlanId 上对 (2) 进行分组,并
grouping(PlanId)
在每列中生成空字符串的测试;这是每个 PlanId 组之后的空白行。
- 构建一个超级查询 over(3),为每一行分配一个连续的 RowNumber,然后计算字段
PageNumber = floor(RowNumber / 20)
和 PageSequence = RowNumber mod 20
。
- 使用适当的 PageSequence 值手动构建页眉/页脚行,并交叉连接到 (4) 中的 PageNumber 的不同值。
- 使用适当的 Order By 子句联合所有 (4) 和 (5)。
- 等等。
我必须应用这些技术的实际应用程序需要创建一个 MS-Access 报告,该报告具有无限数量的横向用完的页面,每页有 6 个数字列和 1 个描述性列,最后的数字列是所有以前的总和数字列。整个报告是其中的三个,每个都从一个新页面开始,但每个都有不同数量的数字列。由于原始数据在 SQL Server 上的存储方式以及缓慢的数据链接,将整个报表作为一个查询运行比三个单独的查询要高效得多。
玩得开心。
PS
由于其他项目限制,我受益于使用类似于旧式 C 的 SQL 宏工具动态创建此 SQL;手卷当然,因为谁听说过这样的事情。当你可以这样写时,它看起来几乎是结构化的。