Oracle 从一列变身多列(oracle 1列变多列)
Oracle: 从一列变身多列
在Oracle中,我们经常需要将一列数据按照不同的条件进行分类或者分割成多个列,这时候就需要用到Pivot或者Transposition方法。本文将介绍如何在Oracle中使用这些方法将一列数据变为多列。
一、Pivot方法
Pivot方法将行列互换并按照指定的列值分组计算数据。在Oracle 11g及以上版本中,Pivot方法已经内置在SQL中。下面是一些简单的代码演示。
1. 建表
我们首先创建一张示例表:
“`sql
CREATE TABLE sales (
salesperson VARCHAR2(10),
month VARCHAR2(6),
product VARCHAR2(10),
sales NUMBER(8,2)
);
INSERT INTO sales VALUES (‘Amy’, ‘Jan’, ‘Shoes’, 1000);
INSERT INTO sales VALUES (‘Amy’, ‘Jan’, ‘Clothes’, 500);
INSERT INTO sales VALUES (‘Amy’, ‘Feb’, ‘Shoes’, 1300);
INSERT INTO sales VALUES (‘Bobby’, ‘Jan’, ‘Shoes’, 1500);
INSERT INTO sales VALUES (‘Bobby’, ‘Feb’, ‘Clothes’, 1200);
INSERT INTO sales VALUES (‘Bobby’, ‘Feb’, ‘Shoes’, 2000);
2. Pivot方法示例
下面的示例将销售人员销售的产品以及每个月的销售额展示出来:
```sqlSELECT *
FROM ( SELECT salesperson, month,
product, sales FROM sales
)PIVOT (
SUM(sales) FOR month IN ('Jan' as Jan_sales, 'Feb' as Feb_sales)
)ORDER BY salesperson;
输出结果如下:
| SALESPERSON | PRODUCT | JAN_SALES | FEB_SALES |
| ———–| ——- | ———| ——— |
| Amy | Shoes | 1000 | 1300 |
| Amy | Clothes| 500 | null |
| Bobby | Shoes | 1500 | 2000 |
| Bobby | Clothes| null | 1200 |
从结果中我们可以看到,我们已经将每个月的销售额转换为了新的列。
二、Transposition方法
Transposition方法则是通过使用Oracle中的聚合函数来将一列数据分割成多个列。下面是一个简单的例子。
1. 建表
我们同样先建立一张示例表:
“`sql
CREATE TABLE employee (
emp_id NUMBER(10),
salary_month VARCHAR2(6),
salary NUMBER(10)
);
INSERT INTO employee VALUES (1, ‘Jan’, 5000);
INSERT INTO employee VALUES (1, ‘Feb’, 5500);
INSERT INTO employee VALUES (1, ‘Mar’, 6000);
INSERT INTO employee VALUES (2, ‘Jan’, 7000);
INSERT INTO employee VALUES (2, ‘Feb’, 7500);
INSERT INTO employee VALUES (2, ‘Mar’, 8000);
2. Transposition方法示例
下面的示例将每个员工每个月的薪资展示出来:
```sqlSELECT *
FROM ( SELECT emp_id, salary_month, salary
FROM employee)
PIVOT ( MAX(salary)
FOR salary_month IN ('Jan' as Jan_salary, 'Feb' as Feb_salary, 'Mar' as Mar_salary))
ORDER BY emp_id;
输出结果如下:
| EMP_ID | JAN_SALARY | FEB_SALARY | MAR_SALARY |
| ——-| ———-| ———-| ———-|
| 1 | 5000 | 5500 | 6000 |
| 2 | 7000 | 7500 | 8000 |
从结果中我们可以看到,我们已经按照条件将数据分割为多个列。
综上所述,Pivot和Transposition方法都可以实现将一列数据分割为多个列的操作,而在Oracle中这些方法都已经内置在SQL语言中,使用简单方便。