这个很难解释,所以我将尝试使用示例来展示我的意思。请注意,我并不是在问是否可以在一个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来获取总计等。