以下SQL并不是我需要的。在一个查询中,我按照汇总行总计 部分#和日期。 这是发票历史记录文件。用户有一个报告显示部分#出售的QTY - 但在那里使用的文件不保存$ amt。所以我创建了一个查询,创建一个在Part#和date上打破的临时文件。因为报告按日期选择。这个sql是由RTVQMQRY创建的。 IT似乎没有总结。
SELECT
ALL (((T02.IDSHP#*IDNTU$))), T02.IDDOCD, T02.IDINV#, T02.IDPRT#
FROM DTALIB/OEIND1 T02 INNER JOIN
OKLIB/ICDET76OK T01
ON T02.IDCOM# = T01.ITCOM#
AND T02.IDIDC# = T01.ITTRN#
WHERE IDDOCD >= 20130101
ORDER BY 004 ASC, 003 ASC, 002 ASC, 001 ASC
答案 0 :(得分:2)
SQL不是报告工具。 SQL是一种要求数据集的语言;通常是细节或总计(GROUP BY)。如果指定GROUP BY WITH ROLLUP,SQL将执行总计,但这不适用于此。
您可以采取多种方法。
1)创建一个视图或逻辑文件,用于执行上面指定的JOIN。然后使用Query / 400生成所需的报告,包括总计。
2)由于SQL想要返回一个集合,返回2个集合并执行UNION。第一组是细节,第二组是总数。有一点技巧,因为两组中的每一列都需要是相同的数据类型,但是这样的东西应该有效:
SELECT
ALL 'D', T02.IDSHP#*IDNTU$, T02.IDDOCD, T02.IDINV#, T02.IDPRT#
FROM DTALIB/OEIND1 T02 INNER JOIN
OKLIB/ICDET76OK T01
ON T02.IDCOM# = T01.ITCOM#
AND T02.IDIDC# = T01.ITTRN#
WHERE IDDOCD >= 20130101
union
SELECT
ALL 'T', sum(T02.IDSHP#*IDNTU$), ' ', 0, 0
FROM DTALIB/OEIND1 T02 INNER JOIN
OKLIB/ICDET76OK T01
ON T02.IDCOM# = T01.ITCOM#
AND T02.IDIDC# = T01.ITTRN#
WHERE IDDOCD >= 20130101
ORDER BY 1, 5, 4, 3, 2
看第二个SELECT?它与第一列具有相同的列,并且希望具有相同的数据类型。如果您的发票编号或部件编号是字符列,则使用字符('')而不是数字(0)。为了确保总数在细节之后,我添加了另一个列,它将对总计进行排序。
从样式的角度来看,我会使用有意义的相关名称。 T01和T02不像INV和DTL那样易于读取(以及将来调试)。是的,这就是RTVQMQRY生成的内容,但你不需要这样做。
答案 1 :(得分:0)
Nooooooooo .... 请不要使用Query / 38(哦,是的,抱歉,他们将其重命名为Query / 400),自1982年以来一直存在并且可能未经改进。
QM Query是一种报告工具,可帮助您格式化报告,具有多级中断,允许类似于Query / 400的提示界面。您已经找到了如何将旧查询检索到QM查询源中。使用STRQM,您可以在提示模式下使用查询本身(因为Query / 400用户最熟悉),如果您愿意,或者在SQL模式下,我建议您更熟悉SQL。这帮助我在几年前学习。
您可以定义QM查询表单,它将为您提供您可能需要的级别中断和其他格式。在此模式下,您可以让表单执行中断和汇总,而您的SQL只需提供报表的详细信息行。
答案 2 :(得分:0)
使用QM查询的建议是可能的解决方案的一部分。 (可能永远不应该使用Query / 400.)你已经部分地这样做了,因为你使用了RTVQMQRY来生成SQL'查询'。但接下来,您需要运行RTVQMFORM以从现有查询中生成报告。报告是创建报告摘要的地方。
正如Buck所示,技术上可以纯粹在查询本身内生成摘要行。但即使这样仍需要报告格式化。