2015-04-12 2 views
-1

У меня есть задание, которое просит меня написать процедуру PL/SQL, чтобы заказать таблицу, содержащую метки учащихся. Он должен упорядочить в порядке возрастания нечетные строки и в порядке убывания четные строки. Чтобы определить, является ли запись нечетной или четной, вы должны использовать столбец идентификатора таблицы. Идентификатор является первичным ключом и содержит целые числа. Другие столбцы (с именем: col1, col2, ...) содержат метки, также как целые числа. Эта процедура должна выполняться, даже если число столбцов меняется. Я думаю об этом решении, используя% ROWTYPE, но я не уверен, как упорядочить строку, которая будет сохранена в строке. У кого-нибудь есть идея?Заказ нечетных и четных строк на основе ID

+0

Вы почти наверняка получите лучший ответ, если бы включили код, который вы написали, чтобы попытаться ответить на вопрос, а также проблемы, с которыми вы столкнулись, и объяснение того, как результаты вы «Вы получаете отличные от ожидаемых результатов. Включение ссылки на SQLFiddle с таблицами, созданными с данными, всегда приветствуется. Однако вопросы о домашнем задании, опубликованные без каких-либо доказательств разумной попытки со стороны ученика решить проблему, как правило, игнорируются. –

ответ

1

Решение зависит от желаемого результата. Для начала нам нужно найти решение для известного числа столбцов.

Input (table GRADES):  Output A:  Output B: 
ID COL1 COL2 COL3 COL4  ID LIST   ID COL1 COL2 COL3 COL4 
-- ---- ---- ---- ----  -- --------  -- ---- ---- ---- ---- 
1 7 3 9 2  1 2,3,7,9  1 2 3 7 9 
2 1 6 2 2  2 6,2,2,1  2 6 2 2 1 
3 4 8 5 3  3 3,4,5,8  3 3 4 5 8 
4 1 9 8 4  4 9,8,4,1  4 9 8 4 1 
5 4 1 9 3  5 1,3,4,9  5 1 3 4 9 

Самый быстрый и, пожалуй, самый простой способ - неавторизовать данные, сортировать и в конечном итоге поворачивать снова. Для выхода А вы можете использовать этот запрос SQLFiddle:

select id, decode(mod(id, 2), 
    1, listagg(grade, ', ') within group (order by grade), 
    0, listagg(grade, ', ') within group (order by grade desc)) list 
    from grades unpivot (grade for col in (col1, col2, col3, col4)) 
    group by id 

Для вывода B SQLFiddle:

select * from (
    select id, c, row_number() over (partition by id 
     order by id, decode(mod(id, 2), 1, c, -c)) rn 
     from grades unpivot (c for col in (col1, col2, col3, col4))) 
    pivot (max(c) for rn in (1 as col1, 2 as col2, 3 as col3, 4 as col4)) 

Это чистый SQL требует Oracle 11g. Для неизвестного количества столбцов вам нужен PLSQL (блок, процедура или функция). Сначала вы можете проверить, какие столбцы существуют в вашей таблице - проверьте его в словаре user_tab_cols или all_tab_cols. Далее постройте один из моих запросов, просто соедините имена основной части и столбца, прочитанные из словаря, обрабатываемого в простых циклах. Затем запустите этот запрос с помощью execute immediate. Вы можете найти это answer полезным, там я сделал что-то подобное. Я не хочу дать вам полное решение, потому что это ваша домашняя работа, и самая трудная часть решена ;-)

Есть и другие способы: прочитать данные в массиве и отсортировать их, используя некоторые сортировки alghoritm и т. Д. , , но я считаю, что распутывание является самым быстрым и простым. Удачи :-)

 Смежные вопросы

  • Нет связанных вопросов^_^