3

これは説明するのが難しいので、例を使用して説明します。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 でも中断することです (1 つの請求書番号に 2 つの請求日を含めることはできないことがわかっているため)。

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 でこれを達成する方法はありますか?

4

3 に答える 3

4

次のようなものが必要です。

列 DUMMY NOPRINT
BREAK ON DUMMY ON vendor ON invoice_no
SELECT CONCAT (vendor, invoice_no) DUMMY、invoice_no、invoice_date、ベンダー、アカウント、金額
FROM 請求書
ORDER BY vendor、invoice_no、アカウント

印刷されないように設定し、column DUMMYチェックする必要がある2つのフィールドの連結として選択で定義しています。

DUMMY は任意の名前ですが、このような場合によく使用されるのは、何かを計算する必要があるが表示しない場合です。

追加の " ON vendor ON invoice_no" を使用すると、DUMMY ブレークとは別に、これらの列の複製を制御できます。DUMMY同様に、合計などを取得するために使用して計算できます。

于 2010-12-21T19:31:47.410 に答える
2

式を作成できるBREAK ONため、対象のフィールドを文字列に変換して連結すること||で、「両方の値」で中断できる式をまとめることができるはずです。

于 2009-06-11T20:33:55.580 に答える
1

SQL*Plusでうまくいくようには思えません。sed請求書番号が空白の場合は常に、請求書の日付を削除するために使用することになりました。

sed -re 's/^( {11})[0-9A-Z-]{11}(.+)$/\1           \2/'
于 2009-06-12T17:50:01.723 に答える