这个很难解释,所以我会尝试展示我在使用示例后的内容。请注意,我不是在询问是否可以在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中完成此任务?
答案 0 :(得分:4)
你想要这样的东西:
列DUMMY NOPRINT
在供应商ON invoice_no上打开DUMMY ON SELECT CONCAT(vendor,invoice_no)DUMMY,invoice_no,invoice_date,vendor,account,amount
从发票
ORDER BY vendor,invoice_no,account
您要将column DUMMY
设置为未打印
然后在您的选择中将其定义为您需要检查的两个字段的串联。
DUMMY只是一个任意名称,但是对于这样的情况常用,你需要计算一些但不显示它
额外的“ON vendor ON invoice_no
”允许您控制与DUMMY中断分开的那些col上的重复项。同样,您可以使用DUMMY
进行计算以获得总计等。
答案 1 :(得分:2)
你可以BREAK ON
表达式,所以通过将感兴趣的字段转换为字符串并将它们与||
连接起来,你应该能够将一个表达式放在一起,让你可以打破它们的两个值”
答案 2 :(得分:1)
看起来SQL * Plus似乎无法做到这一点。当发票号为空白时,我最终使用sed
来清除发票日期:
sed -re 's/^( {11})[0-9A-Z-]{11}(.+)$/\1 \2/'