3

这个很难解释,所以我将尝试在使用示例后展示我的意思。请注意,我不是在问是否可以在一个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 中实现这一点?

4

3 回答 3

4

你想要这样的东西:

列 DUMMY NOPRINT
BREAK ON DUMMY ON vendor ON invoice_no
SELECT CONCAT (vendor, invoice_no) DUMMY, invoice_no, invoice_date, vendor, account,amount
FROM invoice
ORDER BY vendor, invoice_no, account

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

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

额外的 " ON vendor ON invoice_no" 允许您控制那些与 DUMMY 中断分开的列上的 dup。同样,您可以计算使用DUMMY来获取总数等。

于 2010-12-21T19:31:47.410 回答
2

您可以BREAK ON使用表达式,因此通过将感兴趣的字段转换为字符串并将它们与您连接起来,||您应该能够组合一个表达式,让您打破“它们的两个值”。

于 2009-06-11T20:33:55.580 回答
1

SQL*Plus 似乎无法解决问题。每当发票编号为空白时,我最终都会使用sed摆脱发票日期:

sed -re 's/^( {11})[0-9A-Z-]{11}(.+)$/\1           \2/'
于 2009-06-12T17:50:01.723 回答