2014-02-09 37 views
0

下面的SQL并不完全是我所需要的。在查询中,我根据 零件编号和日期对行总数进行求和。 这是发票历史记录文件。用户有一份报告显示按部件#销售的数量 - 但是那里使用的文件不包含$ amt。所以我做了一个查询,创建了一个临时文件,该文件在Part#和Date上打破。因为报告按日期选择。这个sql由RTVQMQRY创建。 IT似乎没有总结。需要SQL要做类似Query/400的摘要

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       

回答

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 

见第二次选择?它与第一列具有相同的列,并且希望具有相同的数据类型。如果您的发票号码或零件号码是字符列,则使用字符('')而不是数字(0)。为了确保总数在详细信息之后出现,我添加了另一列,将最后的总数排序。

从风格的角度来看,我会使用有意义的相关名称。 T01和T02不像INV和DTL那样容易阅读(并在未来进行调试)。是的,这就是RTVQMQRY生成的内容,但你不需要这样保留它们。

0

Nooooooooo .... 不要使用Query/38(噢,不好意思,但他们又改名为查询/ 400),其中已经有大概未改良的自1982年以来

QM查询是一种报告工具,可帮助您格式化报告,具有多级别休息,并允许提示类似于Query/400的界面。您已经找到了如何将旧查询检索到QM查询源。使用STRQM,您可以在提示模式下使用查询本身(如Query/400用户将最舒服的方式),最初如果您愿意,或者使用SQL模式,我建议您更适合使用SQL。这在几年前帮助我学习。

您可以定义一个QM查询表单,它将为您提供您可能需要的级别中断和其他格式。在这种模式下,你可以让表单做休息和总结,而你的SQL只需要提供报表的细节行。

+0

FWiW,如果有人关心:Query/38可能仍然是实用程序¿DB1产品代码的一部分?功能与产品库QIDU在S/38环境中使用[库QSYS38];仿真由CALL QCL开始。 Query/400是Query/36的*端口*;从S/36EE开始,QRY与WRKQRY对应,S36E QRYRUN与RUNQRY对应。 Query/38与Query/400完全不同;我记得,它实际上具有跑步功能。 – CRPence

0

使用QM Query的建议是可能解决方案的一部分。 (Query/400可能不应该被使用。)你已经部分地这样做了,因为你使用RTVQMQRY来生成SQL'查询'。但接下来,您需要运行RTVQMFORM以从现有查询中生成报告。报告是创建报告摘要的地方。

正如Buck所示,在技术上可以在查询本身内生成纯粹的汇总行。但即便如此,仍然需要报告格式。