3

使用标准 SQL,我如何制作带有顶部标题的报告?

去年我参加了一个数据库竞赛。描述说我可以使用 MySQL、Oracle 或 MS SQL Server。我选择 MySQL,因为那是我所熟悉的。它说我必须使用标准 SQL 编写一个可以在任何列出的 DBMS 中工作的 sql 语句。我搜索了谷歌,但没有找到任何教程或与以下问题相关的任何内容。任何关于在哪里寻找或搜索什么的建议都会很棒。

  1. 按计划 ID 分组并执行控制中断(中断后跳过一行)。
  2. 如图所示插入顶部标题和底部标题。
  3. 将页面大小设置为 30,将行宽设置为 65。
  4. 第 1 列的宽度为 10,第 2 列的宽度为 15,第 3 列的宽度为 15,第 4 列的宽度为 20。

预期的格式化报告如下所示:

在此处输入图像描述

4

2 回答 2

3

18 个月前,我不得不为现实世界的报告应用程序构建 2 个与此类似的查询。这些要求是不寻常的,并且对于一个不寻常的报告环境来说,但仍然是相当理智和明智的。然后将查询的最终产品转入 MS-Access 以进行最终报告和打印。实际上编程很有趣。

使用我最熟悉的 SQL 方言 SQL Server,可以如下构建报表。

请注意,在概述的报告的 30 行中,有 20 行是数据行,10 行是页眉、列标题或页脚行。

  1. 为按计划 ID 分组的主要数据构建一个查询,该查询将每个字段转换为所需长度的 varchar。
  2. 在 (1) 上构建一个超级查询,生成单个 65 个字符的文本字符串作为每行输出
  3. 构建一个超级查询,在 PlanId 上对 (2) 进行分组,并grouping(PlanId)在每列中生成空字符串的测试;这是每个 PlanId 组之后的空白行。
  4. 构建一个超级查询 over(3),为每一行分配一个连续的 RowNumber,然后计算字段PageNumber = floor(RowNumber / 20)PageSequence = RowNumber mod 20
  5. 使用适当的 PageSequence 值手动构建页眉/页脚行,并交叉连接到 (4) 中的 PageNumber 的不同值。
  6. 使用适当的 Order By 子句联合所有 (4) 和 (5)。
  7. 等等。

我必须应用这些技术的实际应用程序需要创建一个 MS-Access 报告,该报告具有无限数量的横向用完的页面,每页有 6 个数字列和 1 个描述性列,最后的数字列是所有以前的总和数字列。整个报告是其中的三个,每个都从一个新页面开始,但每个都有不同数量的数字列。由于原始数据在 SQL Server 上的存储方式以及缓慢的数据链接,将整个报表作为一个查询运行比三个单独的查询要高效得多。

玩得开心。

PS 由于其他项目限制,我受益于使用类似于旧式 C 的 SQL 宏工具动态创建此 SQL;手卷当然,因为谁听说过这样的事情。当你可以这样写时,它看起来几乎是结构化的。

于 2013-03-25T22:39:37.297 回答
0

我正在清理旧问题。对于任何可能好奇的人,我实际上在比赛中使用了 PL/SQL。非常适合直接在 SQL 中创建“报告”。http://www.oracle.com/technetwork/database/features/plsql/index.html

于 2018-01-28T22:46:13.993 回答