需要SQL执行像Query / 400这样的摘要

时间:2014-02-09 03:23:05

标签: sql ibm-midrange db2-400

以下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                           

3 个答案:

答案 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所示,技术上可以纯粹在查询本身内生成摘要行。但即使这样仍需要报告格式化。