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中实现两行转一行的方法,希望对读者有所帮助。