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