2009-06-11 36 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得到總計等

相關問題