Это сложно объяснить, поэтому я постараюсь показать, что я, после использования примеров. Обратите внимание, что я не спрашиваю, возможно ли использовать несколько столбцов в выражении 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
Таким образом, вы можете видеть, что некоторые поставщики имеют несколько счетов, а некоторые счета имеют несколько учетных записей.
Чтобы скрыть повторяющиеся имена поставщиков и номера счетов, я могу использовать команду BREAK
SQL * Plus, например:
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?