Можно ли сломать столбец в дополнение к столбцу, указанному в SQL * Plus? - PullRequest
3 голосов
/ 12 июня 2009

Это сложно объяснить, поэтому я постараюсь показать, что я, после использования примеров. Обратите внимание, что я не спрашиваю, возможно ли использовать несколько столбцов в выражении 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?

Ответы [ 3 ]

4 голосов
/ 21 декабря 2010

Вы хотите что-то вроде этого:

колонка DUMMY NOPRINT
BREAK ON DUMMY ON поставщик ON invoice_no
ВЫБЕРИТЕ КОНКАТ (поставщик, invoice_no) DUMMY, invoice_no, invoice_date, поставщик, аккаунт, сумма
ОТ счета
ЗАКАЗАТЬ ПО продавцу, invoice_no, аккаунт

где вы устанавливаете column DUMMY как не напечатанное а затем определите его в своем выборе как объединение двух полей, которые необходимо проверить.

DUMMY - это просто произвольное имя, но обычно используется в таких случаях, когда вам нужно что-то вычислить, а не отображать

Дополнительный «ON vendor ON invoice_no» позволяет вам контролировать дупс на тех cols отдельно от DUMMY break. Точно так же вы можете вычислить, используя DUMMY для получения итогов и т. Д.

2 голосов
/ 12 июня 2009

Вы можете BREAK ON выражение, поэтому, превращая интересующие поля в строки и объединяя их с помощью ||, вы сможете составить выражение, которое позволит вам разбить «оба их значения».

1 голос
/ 12 июня 2009

Не похоже, что SQL * Plus справится с задачей. В итоге я использовал sed, чтобы избавиться от дат счета, когда номер счета был пустым:

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