SQL - Oracle - 多列中的相同字段

时间:2014-11-06 18:50:09

标签: sql oracle rows

我有一个学生和一个教师表(只有相应的名称字段是相关的)。我想对它进行排序,然后获得三列输出。

教师

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 :(得分: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