У меня есть запрос с этими результатами:
A | 1 A | 2 B | 1 B | 2 B | 3
Как мне сделать так, чтобы результаты были такими:
A | 1 | 2 B | 1 | 2 | 3
Вот один из способов:
SELECT CASE WHEN rn = 1 THEN c1 ELSE NULL END || ' | ' || c2 FROM (SELECT c1, c2, ROW_NUMBER() OVER (PARTITION BY c1 ORDER BY c2) rn FROM your_table);
Вы можете использовать BREAK ON, если используете sqlplus:
BREAK ON
SQL> desc tab1; Name Null? Type ----------------------------------------- -------- ---------------------------- COL VARCHAR2(1) COL2 NUMBER SQL> select * from tab1; C COL2 - ---------- A 1 A 2 B 1 B 2 B 3 SQL> break on col; SQL> select * from tab1; C COL2 - ---------- A 1 2 B 1 2 3 SQL>
Подробнее здесь .
Я смело помню, что есть способ получить этот формат в SQL PLus. Другой возможный способ приведен ниже:
SELECT a.COLUMN_1, CASE WHEN a.rnk = 1 THEN a.COLUMN_2 ELSE NULL END AS COLUMN_2 FROM ( SELECT a.*, RANK() OVER(PARTITION BY COLUMN_1 ORDER BY COLUMN2) rnk FROM <YOUR_TABLE> a ) a
в oracle, проверьте функции LEAD и LAG.
LEAD
LAG
, вы можете посмотреть предыдущую строку, и, если она совпадает с текущей строкой, измените значение на NULL.
Это больше проблема форматирования, лучше всего решаемая тем, что вы используете для отображения вывода. Нет ничего плохого в результате запроса, как результат запроса .
Это требование к представлению лучше всего выполнять в приложении, которое вы используете для отображения результатов, а не в необработанном SQL. Вы можете удовлетворить ваши требования с помощью курсора, но это не очень элегантное решение.