这个很难解释,所以我会尝试在使用示例后展示我的意思。请注意,我不是在询问是否可以在 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 中实现这一点吗?
最佳答案
你想要这样的东西:
column 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
进行计算以获取总计等。
关于reporting - 除了 SQL*Plus 中指定的列之外,是否可以对列进行 BREAK ON?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/983415/