#sql #oracle
#sql #Oracle
Вопрос:
Мои данные имеют категории и подкатегории в отдельных таблицах. Когда я пишу запрос, чтобы объединить их, я получаю приведенную ниже таблицу с повторяющимися строками категорий:
| Col1 | Col2 | Col3 | Col 4 |
|-------|-----------|------------|-------|
| Cat1 | Cat1 Data | Subcat 1.1 | Etc |
|-------|-----------|------------|-------|
| Cat1 | Cat1 Data | Subcat 1.2 | Etc |
|-------|-----------|------------|-------|
| Cat1 | Cat1 Data | Subcat 1.3 | Etc |
|-------|-----------|------------|-------|
| Cat2 | Cat2 Data | Subcat 2.1 | Etc |
|-------|-----------|------------|-------|
| Cat2 | Cat2 Data | Subcat 2.2 | Etc |
|-------|-----------|------------|-------|
| Cat2 | Cat2 Data | Subcat 2.3 | Etc |
|-------|-----------|------------|-------|
Есть ли какой-либо способ вывести это на печать с отображением основной категории только один раз?
| Col1 | Col2 | Col3 | Col 4 |
|-------|-----------|------------|-------|
| Cat1 | Cat1 Data | Subcat 1.1 | Etc |
|-------|-----------|------------|-------|
| | | Subcat 1.2 | Etc |
|-------|-----------|------------|-------|
| | | Subcat 1.3 | Etc |
|-------|-----------|------------|-------|
| Cat2 | Cat2 Data | Subcat 2.1 | Etc |
|-------|-----------|------------|-------|
| | | Subcat 2.2 | Etc |
|-------|-----------|------------|-------|
| | | Subcat 2.3 | Etc |
|-------|-----------|------------|-------|
Поиск в Интернете возвращает только ссылки на использование distinct или groupby, которые, похоже, на самом деле не соответствуют варианту использования. Я понимаю, что ответ здесь обычно «использовать инструмент внешнего интерфейса», но в моем случае это не совсем вариант.
Ответ №1:
Привет, похоже, это действительно делает то, что вы хотите
Данные (DDL)
create table example(
col1 varchar(100),
col2 varchar(100),
col3 varchar(100),
col4 varchar(100)
);
insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.1', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.2', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat1','Cat1 Data', 'Subcat 1.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');
insert into example(col1,col2,col3,col4) values('Cat2','Cat2 Data', 'Subcat 2.3', 'Etc');
SQL-запрос (ответ)
select
CASE WHEN lag(col1) over (partition by null order by col1) = col1 THEN null ELSE col1 END col1,
CASE WHEN lag(col2) over (partition by null order by col2) = col2 THEN null ELSE col2 END col2,
col3, col4
From example
Комментарии:
1. Интересное решение. Кстати, похоже, что
partition by null
может быть опущено sqlfiddle.com /#!4/def46f/1
Ответ №2:
Вам лучше избегать повторения. Но вы можете использовать row_number()
:
select (case when row_number() over (partition by col1, col2 order by ?) = 1
then col1
end) as col1
(case when row_number() over (partition by col1, col2 order by ?) = 1
then col2
end) as col2,
. . .
from t
order by col1, col2, ?;
Обратите внимание, что ?
для столбца, который определяет порядок — то, что определяет «первый» для каждой строки.
Очень важно, чтобы вы включили order by
во внешний запрос. Наборы результатов SQL (например, таблицы) неупорядочены. Без order by
строки могут быть возвращены в любом порядке, но порядок важен в этом случае.