2009-06-11 35 views
2

这是一个很难解释的问题,所以我会尝试使用示例来展示我的内容。请注意,我不问是否可以在BREAK声明中使用多列 - 我知道它是。除了在SQL * Plus中指定的列之外,是否可以在列上打破?

假设我有类似下面的查询:

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,T Ø也打破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

你可以看看这个[链接](http://www.sqlservercentral.com/Forums/Topic799618-338-1.aspx#bm801297) – Smart003 2015-10-20 10:21:36

回答

1

它似乎不像SQL * Plus可以做到这一点。最后我用sed摆脱发票日期每当发票号码是空的:

sed -re 's/^({11})[0-9A-Z-]{11}(.+)$/\1   \2/' 
2

您可以使用BREAK ON表达式,因此通过将感兴趣的字段转换为字符串并将它们与||连接起来,您应该可以将表达式放在一起,让您可以打破“两者的值”。

+0

我想知道有关。您的意思是我应该将查询更改为以“SELECT invoice_no ||”'|| TO_CHAR(invoice_date)invoice_no_date,...“开头,然后BREAK在invoice_no_date列别名上,或者是否存在更为微妙的方式而不改变查询? – yukondude 2009-06-11 21:03:27

3

你想是这样的:

列虚拟NOPRINT
BREAK虚设ON厂商ON invoice_no
SELECT CONCAT(供应商,invoice_no)DUMMY,invoice_no,invoice_date,供应商帐户,量
FROM发票
ORDER BY供应商,invoice_no,帐户

你在哪里设置column DUMMY不打印 ,然后在您的选择定义它,因为你需要检查两个字段的串联。

假人只是一个任意名称,但对于那些需要计算的东西,但不显示它

额外的“ON vendor ON invoice_no”允许您控制这些的cols中的DUP假突破分开这样的情况下共同使用。同样,你可以计算使用DUMMY得到总计等

相关问题