SQL进阶学习——列转行

列转行

一、使用UNION ALL

1.原始数据:(4个季度的销售金额分为四列)

给定一个公司所有员工各个季度销售金额的表格 employee_sales

SQL进阶学习——列转行_第1张图片

2.查询语句

问题:依据 employee_id,把四个字段的数据放到一个字段中。

思路:可以先查询出四个字段,然后用UNION ALL 组合。

SELECT employee_id,employee_name,'一季度',sales_amount_q1 
from employee_sales 
UNION ALL
SELECT employee_id,employee_name,'二季度',sales_amount_q2 
from employee_sales 
UNION ALL
SELECT employee_id,employee_name,'三季度',ales_amount_q3 
from employee_sales 
UNION ALL
SELECT employee_id,employee_name,'四季度',sales_amount_q4 
from employee_sales
ORDER BY employee_id;

3.查询结果

SQL进阶学习——列转行_第2张图片

二、使用RIGHT和LEFT组合函数提取值,right(left(assessment_level,n),1)

1.原始数据:(员工四季度的绩效考核等级和销售金额都被放进了一个值里)

给定一个公司员工四季度的绩效考核等级和销售金额的表格 employee_assessment

 SQL进阶学习——列转行_第3张图片

2.查询语句

问题:依据 employee_id,把四个字段的数据放到一个字段中。

思路:可以先查询出一字段的不同位置的值,然后用UNION ALL 组合。

SELECT employee_id,employee_name,'1',right(left(assessment_level,1),1)
from employee_assessment
UNION ALL
SELECT employee_id,employee_name,'2',right(left(assessment_level,2),1)
from employee_assessment
UNION ALL
SELECT employee_id,employee_name,'3',right(left(assessment_level,3),1)
from employee_assessment
UNION ALL
SELECT employee_id,employee_name,'4',right(left(assessment_level,4),1)
from employee_assessment
ORDER BY employee_id;

3.查询结果

SQL进阶学习——列转行_第4张图片

4.注意:替代 right(left(assessment_level,n),1)的另一种方法是:使用substring()

新建一个只有一列seq_num[1,2,3,4] 的sequence表

CREATE TABLE sequence(seq_num INT);
INSERT INTO sequence
VALUES
(1),
(2),
(3),
(4);

SELECT
a.*, right(left(a.assessment_level,b.seq_num),1), substring(a.assessment_level,b.seq_num,1)
FROM employee_assessment a ,sequence b
WHERE LENGTH(a.assessment_level)>=b.seq_num;

三、对于逗号分隔的销售金额数据可以使用SUBSTRING_INDEX()函数实现

 

SUBSTRING_INDEX(SUBSTRING_INDEX(sales_amount,',',seq_num),-1)

 

你可能感兴趣的:(SQL)