2014-11-06 3 views
-2

У меня есть студент и таблица учителей (только соответствующее поле ). Я хочу отсортировать его, а затем получить вывод из трех столбцов.SQL - Oracle - одно поле в нескольких столбцах

Учителя

SELECT 'Aschauer' tName FROM DUAL UNION ALL 
SELECT 'Auwald' FROM DUAL UNION ALL 
SELECT 'Berger' FROM DUAL UNION ALL 
SELECT 'Beringer' FROM DUAL UNION ALL 
SELECT 'Bilek' FROM DUAL UNION ALL 
SELECT 'Hanke' FROM DUAL UNION ALL 
SELECT 'Lindner' FROM DUAL UNION ALL 
SELECT 'Lenau' FROM DUAL UNION ALL 
SELECT 'Mayer' FROM DUAL UNION ALL 
SELECT 'Pirkner' FROM DUAL UNION ALL 
SELECT 'Preissl' FROM DUAL UNION ALL 
SELECT 'Siegel' FROM DUAL UNION ALL 
SELECT 'Walter' FROM DUAL 

Студенты

SELECT 'Adler' sName FROM DUAL UNION ALL 
SELECT 'Kneippp' FROM DUAL UNION ALL 
SELECT 'Geyer' FROM DUAL UNION ALL 
SELECT 'Sitzenbleiber' FROM DUAL UNION ALL 
SELECT 'Huber' FROM DUAL UNION ALL 
SELECT 'Schulz' FROM DUAL UNION ALL 
SELECT 'Hundertwasser' FROM DUAL UNION ALL 
SELECT 'Berger' FROM DUAL UNION ALL 
SELECT 'Feuerstein' FROM DUAL UNION ALL 
SELECT 'Mayer' FROM DUAL UNION ALL 
SELECT 'Sandler' FROM DUAL UNION ALL 
SELECT 'Graf' FROM DUAL UNION ALL 
SELECT 'Schlager' FROM DUAL 

Ожидаемый результат

Adler   Aschauer  Auwald   
Berger  Beringer  Bilek   
Feuerstein Geyer   Graf   
Hanke   Huber   Hundertwasser 
Kneippp  Lenau   Lindner  
Mayer   Pirkner  Preissl  
Sandler  Schlager  Schulz   
Siegel  Sitzenbleiber Walter 
+1

Конечно, вы можете принять усилия, чтобы изменить свой вопрос и добавить примеры данных и желаемые результаты. –

+0

Я хотел бы отредактировать вопрос, ну, что не работает, попробовал несколько раз сейчас:/Я думал, что это легко понять. У меня есть две таблицы ... Один ученик с S_Name и один учитель с t_name. Теперь я хочу, чтобы все имена (преподаватели и ученики) были на одном выходе (как показано на рисунке) упорядочены по алфавиту и в 3 колонках. – JoshuadV

+0

Мне жаль, что я не задал вопрос, как сейчас делал Abecee, это был мой первый вопрос в Stackoverflow, и я не знал, как правильно спросить. В следующий раз это будет лучше, я обещаю;) – JoshuadV

ответ

0

Взял данные http://pastebin.com/xg1H9sT9

Испытано в Oracle 11 .2:

WITH 
teacher AS (
    SELECT 'Aschauer' tName FROM DUAL UNION ALL 
    SELECT 'Auwald' FROM DUAL UNION ALL 
    SELECT 'Berger' FROM DUAL UNION ALL 
    SELECT 'Beringer' FROM DUAL UNION ALL 
    SELECT 'Bilek' FROM DUAL UNION ALL 
    SELECT 'Hanke' FROM DUAL UNION ALL 
    SELECT 'Lindner' FROM DUAL UNION ALL 
    SELECT 'Lenau' FROM DUAL UNION ALL 
    SELECT 'Mayer' FROM DUAL UNION ALL 
    SELECT 'Pirkner' FROM DUAL UNION ALL 
    SELECT 'Prei' FROM DUAL UNION ALL 
    SELECT 'Siegel' FROM DUAL UNION ALL 
    SELECT 'Walter' FROM DUAL), 
student AS (
    SELECT 'Adler' sName FROM DUAL UNION ALL 
    SELECT 'Kneippp' FROM DUAL UNION ALL 
    SELECT 'Geyer' FROM DUAL UNION ALL 
    SELECT 'Sitzenbleiber' FROM DUAL UNION ALL 
    SELECT 'Huber' FROM DUAL UNION ALL 
    SELECT 'Schulz' FROM DUAL UNION ALL 
    SELECT 'Hundertwasser' FROM DUAL UNION ALL 
    SELECT 'Berger' FROM DUAL UNION ALL 
    SELECT 'Feuerstein' FROM DUAL UNION ALL 
    SELECT 'Mayer' FROM DUAL UNION ALL 
    SELECT 'Sandler' FROM DUAL UNION ALL 
    SELECT 'Graf' FROM DUAL UNION ALL 
    SELECT 'Schlager' FROM DUAL), 
person AS (
    SELECT 
    TRUNC((RANK() OVER (ORDER BY name) - 1)/3) rw 
    , MOD(ROW_NUMBER() OVER (ORDER BY name), 3) cl 
    , name 
    FROM 
    (SELECT tName name FROM teacher UNION 
    SELECT sName FROM student)) 
SELECT 
    one, two, three 
    FROM (
    SELECT * 
    FROM person 
    PIVOT(MIN(name) FOR cl IN (1 AS one, 2 AS two, 0 AS three))) 
    ORDER BY rw 
; 

Недостаточно репутации для оценки. Таким образом, ответьте здесь (и будьте кратки) ...

  • WITH здесь в основном для структуры/читаемости, да.
  • RANK отражает порядок в цифрах, необходимых для последующего расчета.
  • TRUNC предоставляет целые числа (которые легче ссылаются на следующем этапе) для всех факторов.
  • «rw» и «cl» предназначены для «строк» ​​и «столбцов» соответственно; указывая, что эти столбцы предполагается использовать для дальнейшего использования. (Но поскольку «строка» и «столбец» являются зарезервированными словами ...)
  • PIVOT действительно превращает строки в столбцы. Для его работы только одно значение может быть возвращено для каждого места в матрице. Любая функция группировки будет служить цели вообще; выбор зависит от конкретной проблемы. Да нет.
  • Вы можете проверить эффект добавления ALL в стороне SELECT tName name FROM teacher UNION ALL SELECT sName FROM student

SQL Fiddle

+0

Эй;) Большое спасибо, что работает потрясающе. Спасибо, что редактировал мой вопрос! Это было то, что мне нужно. Теперь это работает, и я пытаюсь это понять. THE WITH помогает мне назвать подзаголовок вправо? так что я могу использовать его позже в запросе? Какова функция Trunk() и Rank()? Ранг() оценивает объект, и когда его то же самое, его одинаковый ранг, я прав? Каково значение trunk() ?. Ну, по крайней мере, я понимаю, что Mod(), я получил его раньше, но не смог реализовать его правильно. U назвал эти две строки rw и cl. Для чего они стоят? Последняя вещь - функция PIVOT(), – JoshuadV

+0

Как это работает? Почему мне нужно использовать групповую функцию MIN()? Следующий блок просто говорит оракул, если cl = 1 в первом столбце, если cl = 2 секунды и т. Д., Я прав? – JoshuadV

+0

Хорошо, я узнал, что мне не нужно использовать Min(), max() также возможно. Я прав, когда я говорю, что мне просто нужно использовать функцию группы, чтобы сделать компилятор счастливым? :) – JoshuadV