我有一个学生和一个教师表(只有相应的名称字段是相关的)。我想对它进行排序,然后获得三列输出。
教师
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
答案 0 :(得分:0)
在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
为所有商提供整数(在下一步中更容易引用)。PIVOT
会将行转换为列。为了使其工作,矩阵中的每个位置只能返回一个值。任何分组功能都可以达到目的;选择取决于具体问题。这不是问题,是的。ALL
SELECT tName name FROM teacher UNION ALL SELECT sName FROM student
的效果