除了 SQL*Plus 中指定的列之外,是否可以 BREAK ON 一列?

yuk*_*ude 3 reporting sqlplus

这个很难解释,所以我将尝试使用示例来展示我的意思。请注意,我并不是在问是否可以在一个BREAK语句中使用多个列——我知道可以。

假设我有如下查询:

SELECT  invoice_no, invoice_date, vendor, account, amount
FROM    invoice
ORDER   BY vendor, invoice_no, account
Run Code Online (Sandbox Code Playgroud)

假设结果集是:

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
Run Code Online (Sandbox Code Playgroud)

所以你可以看到有的供应商有多张发票,有的发票有多个账户。

要隐藏重复的供应商名称和发票号码,我可以使用 SQL*Plus 的BREAK命令,如下所示:

BREAK ON vendor ON invoice_no
Run Code Online (Sandbox Code Playgroud)

产生这个结果集:

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
Run Code Online (Sandbox Code Playgroud)

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

BREAK ON vendor ON invoice_no ON invoice_date
Run Code Online (Sandbox Code Playgroud)

它会走得太远,隐藏发票 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
Run Code Online (Sandbox Code Playgroud)

我真正想要的是像下面这样的命令语法(我创造了这个术语AND):

BREAK ON vendor ON invoice_no AND invoice_date
Run Code Online (Sandbox Code Playgroud)

其目的是,每当它在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
Run Code Online (Sandbox Code Playgroud)

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

在 SQL*Plus 中有什么方法可以实现这一点吗?

小智 5

你想要这样的东西:

列 DUMMY NOPRINT
BREAK ON DUMMY ON 供应商 ON 发票号
SELECT CONCAT (供应商, 发票号) DUMMY、发票号、发票日期、供应商、帐户、发票金额
ORDER
BY 供应商、发票号、帐户

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

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

额外的“ ON vendor ON invoice_no”允许您控制这些列上的重复,与虚拟中断分开。同样,您可以使用计算DUMMY来获取总计等。