除了SQL * Plus中指定的列之外,是否可以在列上进行BREAK?

时间:2009-06-11 20:17:46

标签: reporting sqlplus

这个很难解释,所以我会尝试展示我在使用示例后的内容。请注意,我不是在询问是否可以在BREAK语句中使用多个列 - 我知道它是。

假设我有如下查询:

SELECT  invoice_no, invoice_date, vendor, account, amount
FROM    invoice
ORDER   BY vendor, invoice_no, account

假设结果集是:

INVOICE_NO INVOICE_DATE VENDOR  ACCOUNT AMOUNT
---------- ------------ ------- ------- ------
0001       30-JAN-2009  Alpha   1000     50.00
0003       30-JAN-2009  Alpha   1000    125.00
0003       30-JAN-2009  Alpha   3000     33.33
0006       02-FEB-2009  Alpha   2000     40.00
0005       31-JAN-2009  Bravo   1000     40.00
0002       30-JAN-2009  Charlie 2000    120.75
0002       30-JAN-2009  Charlie 3000      5.00
0004       30-JAN-2009  Charlie 1000    900.50

因此,您可以看到某些供应商有多个发票,而某些发票有多个帐户。

要隐藏重复的供应商名称和发票号,我可以像这样使用SQL * Plus的BREAK命令:

BREAK ON vendor ON invoice_no

生成此结果集:

INVOICE_NO INVOICE_DATE VENDOR  ACCOUNT AMOUNT
---------- ------------ ------- ------- ------
0001       30-JAN-2009  Alpha   1000     50.00
0003       30-JAN-2009          1000    125.00
           30-JAN-2009          3000     33.33
0006       02-FEB-2009          2000     40.00
0005       31-JAN-2009  Bravo   1000     40.00
0002       30-JAN-2009  Charlie 2000    120.75
           30-JAN-2009          3000      5.00
0004       30-JAN-2009          1000    900.50

到目前为止,这么好。我还想隐藏重复的发票日期,以便显示每张发票的第一个日期。但是,如果我使用此命令:

BREAK ON vendor ON invoice_no ON invoice_date

它会走得太远并隐藏发票0003和0004的日期,只是因为它们与以前各自供应商的发票相同:

INVOICE_NO INVOICE_DATE VENDOR  ACCOUNT AMOUNT
---------- ------------ ------- ------- ------
0001       30-JAN-2009  Alpha   1000     50.00
0003                            1000    125.00
                                3000     33.33
0006       02-FEB-2009          2000     40.00
0005       31-JAN-2009  Bravo   1000     40.00
0002       30-JAN-2009  Charlie 2000    120.75
                                3000      5.00
0004                    Charlie 1000    900.50

我真正喜欢的是如下命令语法(我编写术语AND):

BREAK ON vendor ON invoice_no AND invoice_date

目的是,每当它在invoice_no上中断时,也会在invoice_date上中断(因为我知道单个发票号码不能有两个发票日期):

INVOICE_NO INVOICE_DATE VENDOR  ACCOUNT AMOUNT
---------- ------------ ------- ------- ------
0001       30-JAN-2009  Alpha   1000     50.00
0003       30-JAN-2009          1000    125.00
                                3000     33.33
0006       02-FEB-2009          2000     40.00
0005       31-JAN-2009  Bravo   1000     40.00
0002       30-JAN-2009  Charlie 2000    120.75
                                3000      5.00
0004       30-JAN-2009  Charlie 1000    900.50

现在,发票0003和0004正确显示日期。

有没有办法在SQL * Plus中完成此任务?

3 个答案:

答案 0 :(得分:4)

你想要这样的东西:

  

列DUMMY NOPRINT
  在供应商ON invoice_no上打开DUMMY ON   SELECT CONCAT(vendor,invoice_no)DUMMY,invoice_no,invoice_date,vendor,account,amount
  从发票
  ORDER BY vendor,invoice_no,account

您要将column DUMMY设置为未打印 然后在您的选择中将其定义为您需要检查的两个字段的串联。

DUMMY只是一个任意名称,但是对于这样的情况常用,你需要计算一些但不显示它

额外的“ON vendor ON invoice_no”允许您控制与DUMMY中断分开的那些col上的重复项。同样,您可以使用DUMMY进行计算以获得总计等。

答案 1 :(得分:2)

你可以BREAK ON表达式,所以通过将感兴趣的字段转换为字符串并将它们与||连接起来,你应该能够将一个表达式放在一起,让你可以打破它们的两个值”

答案 2 :(得分:1)

看起来SQL * Plus似乎无法做到这一点。当发票号为空白时,我最终使用sed来清除发票日期:

sed -re 's/^( {11})[0-9A-Z-]{11}(.+)$/\1           \2/'