Oracle中实现两行转一行的方法(oracle 两行转一行)

Oracle中实现两行转一行的方法

在数据库查询操作中,有时我们需要将两行数据合并成一行。这时候可以使用Oracle中的Decode函数和Self join语句来实现。

下面我们来介绍具体的实现方法。

首先我们需要创建一个示例表,示例表的结构和数据如下:

CREATE TABLE employee (

id NUMBER(10) NOT NULL,

name VARCHAR2(100),

address VARCHAR2(200),

hire_date DATE,

salary NUMBER(15, 2),

department_id NUMBER(10) NOT NULL

);

–插入示例数据

INSERT INTO employee (id, name, address, hire_date, salary, department_id)

VALUES (1, ‘李明’, ‘上海市浦东新区’, TO_DATE(‘2010-10-01’, ‘YYYY-MM-DD’), 10000, 1);

INSERT INTO employee (id, name, address, hire_date, salary, department_id)

VALUES (2, ‘张三’, ‘北京市海淀区’, TO_DATE(‘2011-01-01’, ‘YYYY-MM-DD’), 12000, 2);

INSERT INTO employee (id, name, address, hire_date, salary, department_id)

VALUES (3, ‘李四’, ‘深圳市福田区’, TO_DATE(‘2012-01-01’, ‘YYYY-MM-DD’), 15000, 1);

INSERT INTO employee (id, name, address, hire_date, salary, department_id)

VALUES (4, ‘王五’, ‘广州市天河区’, TO_DATE(‘2013-01-01’, ‘YYYY-MM-DD’), 18000, 2);

INSERT INTO employee (id, name, address, hire_date, salary, department_id)

VALUES (5, ‘赵六’, ‘上海市长宁区’, TO_DATE(‘2014-01-01’, ‘YYYY-MM-DD’), 20000, 1);

现在我们需要将同一部门的员工姓名合并成一行,并显示部门名称。我们可以使用下面的查询语句实现:

SELECT

d.name,

MAX(CASE WHEN rn = 1 THEN e.name END) AS name1,

MAX(CASE WHEN rn = 2 THEN e.name END) AS name2

FROM (

SELECT

e1.department_id,

e1.name,

ROW_NUMBER() OVER (PARTITION BY e1.department_id ORDER BY e1.name) AS rn

FROM

employee e1

) e

INNER JOIN department d ON e.department_id = d.id

GROUP BY

d.name;

解释一下这个查询语句的实现过程:

1. 使用Self join的方式将employee表与department表连接起来,并分组按部门名称分组。

2. 在查询子句中,使用Case语句将同一部门中员工的姓名分别显示在name1和name2这两列中,如果只有一个员工,则只显示在name1列中。

3. ROW_NUMBER() OVER (PARTITION BY e1.department_id ORDER BY e1.name) AS rn,这个语句用来给员工按姓名排序并显示行号,方便后面使用Case语句显示在不同的列。

最后查询结果如下:

NAME NAME1 NAME2

—— —– —–

财务部 李明 赵六

技术部 张三 王五

通过这种方式可以很方便地将两行数据合并成一行,在实际的数据库查询操作中可以大大提高查询效率。

以上就是Oracle中实现两行转一行的方法,希望对读者有所帮助。


数据运维技术 » Oracle中实现两行转一行的方法(oracle 两行转一行)