sql 行列互转

1、行转列

现有数据:

期望数据:

1.1建表建数据

 IF OBJECT_ID(‘temp_20170701‘,‘u‘) IS NOT NULL DROP TABLE temp_20170701
 CREATE TABLE temp_20170701 (
 ID INT PRIMARY KEY IDENTITY(1,1),
 NAME  NVARCHAR(50),
 Subjectname NVARCHAR(50),
 Score INT
 )

INSERT dbo.temp_20170701( Name, subjectname, Score )
SELECT ‘A‘,‘语文‘,‘20‘ UNION
SELECT ‘A‘,‘数学‘,‘30‘ UNION
SELECT ‘A‘,‘英语‘,‘40‘ UNION
SELECT ‘B‘,‘语文‘,‘50‘ UNION
SELECT ‘B‘,‘数学‘,‘60‘ UNION
SELECT ‘B‘,‘英语‘,‘70‘ UNION
SELECT ‘C‘,‘语文‘,‘80‘ UNION
SELECT ‘C‘,‘数学‘,‘90‘ UNION
SELECT ‘C‘,‘英语‘,‘100‘ UNION
SELECT ‘D‘,‘英语‘,‘100‘

1.2 .1 静态实现

 SELECT Name , MAX(CASE WHEN subjectname=‘语文‘ THEN Score ELSE 0 END)语文 ,
 MAX(CASE WHEN subjectname=‘数学‘ THEN Score  ELSE 0 END)数学,
 MAX(CASE WHEN subjectname=‘英语‘ THEN Score  ELSE 0 END)英语
 FROM dbo.temp_20170701 GROUP BY Name

1.2.2 动态实现 

 DECLARE @sql varchar(500)
 SET @sql=‘select Name ‘
 SELECT @[email protected]+‘,max(case subjectname when ‘‘‘+subjectname+‘‘‘ then Score else 0 end)[‘+subjectname+‘]‘
 FROM(SELECT DISTINCT subjectname FROM temp_20170701)a
 SET @[email protected]+‘ from temp_20170701 group by Name‘
 --SELECT @sql
 EXEC(@sql)

2、行转列 逗号隔开

现有数据如1的第一张图

期望数据:

2.1、使用xml path

 SELECT Name ,Score=STUFF((SELECT ‘,‘+CONVERT(NVARCHAR(max),Score) FROM temp_20170701 t1 WHERE t1.NAME=t2.NAME FOR XML PATH(‘‘)),1,1,‘‘)
 FROM temp_20170701 t2 GROUP BY t2.NAME

2.2、使用 函数

CREATE FUNCTION [dbo].[HConvertL]
(
@GroupId nvarchar(max)
)
RETURNS [nvarchar](max)
AS
BEGIN
DECLARE @ReturnValue [nvarchar](max)
SET @ReturnValue = ‘‘
SELECT @[email protected] + RTRIM(LTRIM(Score)) + ‘,‘
FROM temp_20170701
WHERE NAME = @GroupId
SET @ReturnValue = ‘,‘[email protected] --substring(@ReturnValue,1,len(@ReturnValue)-1)
RETURN @ReturnValue
END

SELECT DISTINCT Name,dbo.[HConvertL](name) Score FROM temp_20170701

3、列转行

原始数据:

期望数据:

3.1建表建数据

IF OBJECT_ID(‘tempdb..#temp_20170701_02‘,‘U‘) IS NOT NULL DROP TABLE #temp_20170701_02
CREATE TABLE #temp_20170701_02
(
ID INT PRIMARY KEY IDENTITY(1,1),
NAME NVARCHAR(50),
语文 INT NOT NULL DEFAULT 0,
数学 INT NOT NULL DEFAULT 0,
英语 INT NOT NULL DEFAULT 0
)
INSERT #temp_20170701_02( NAME, 语文, 数学, 英语 )
SELECT ‘A‘,20,30,40 UNION
SELECT ‘B‘,50,60,70 UNION
SELECT ‘C‘,80,90,100 UNION
SELECT ‘D‘,100,0,0

3.2 使用UNPIVOT实现

SELECT  Name ,
        SubjectName ,
        Score
FROM    #temp_20170701_02 UNPIVOT ( Score FOR SubjectName IN ( 语文, 数学, 英语 ) ) #temp_20170701_02

  

时间: 2024-10-05 05:36:13

sql 行列互转的相关文章

关于SQLServer 中行列互转的实例说明

这几天在做一个招标系统中审批模块,其中关于报价信息这块,用到了pivot和unpivot来实现数据的行列互转,下面简单介绍一下,实际案例,便于回忆和记录相关的条件下使用的情况.pivot 与 unpivot 函数是SQL2005新提供的2个函数,PIVOT 通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合.UNPIVOT 与 PIVOT 执行相反的操作,将表值表达式的列转换为列值. 下面我通过PIVOT 来阐述整个函数的使用: 语

SQL行列转换6种方法

在进行报表开发时,很多时候会遇到行列转换操作,很对开发人员针对于SQL级别行列转换操作一直不甚理解,今天正好抽空对其进行了一些简单的总结.这里主要列举3种可以实现SQL行列转换的方法,包括通用SQL解法以及Oracle支持解法. 一.测试数据 测试表依旧采用Oracle经典的scott模式下的dept表和emp表,结构如下: DEPT: create table DEPT ( DEPTNO NUMBER(2) not null, DNAME VARCHAR2(14), LOC VARCHAR2(

SQL 行列倒置

SQL的的行列倒置已经不是新知识了,但在博主的技术咨询期间,仍发现其实有很多人并不了解这块,所以在此专门写一篇博客记录.本文将以Mysql为例,并以数据采集指标信息获取为例子.在下面的例子,你可以在sqlfiddle运行. 首先我们需要创建数据库Schema: CREATE TABLE Chart (`createTime` DateTime, `kpi` varchar(30), `field` varchar(30), `value` double); INSERT INTO Chart (

SQL行列乾坤大挪移

"生活总是这样,有时候,你需要一个苹果,但别人却给了你一个梨." 今天dalao邮件里需要添加一张每月累计长长的图,可是,拿到手上的SQL导出数据不符合我最爱的pyecharts的数据输入格式,头大. 获得到的数据 日期 种类 数量 9012-01-01 香蕉 10 9012-01-01 苹果 99 9012-01-01 梨 9 9012-01-02 香蕉 100 9012-01-02 苹果 999 9012-01-02 梨 99 pyecharts想要的数据 日期 香蕉 苹果 梨 9

sql server 行列互转

create database Inter_Transformationgocreate table Tb(Uname varchar(30),Course varchar(30),Fraction int)goinsert into tb values('张三','语文',74) insert into tb values('张三','数学',83) insert into tb values('张三','物理',93) insert into tb values('李四','语文',74)

sql server pivot/unpivot 行列互转

有时候会碰到行转列的需求(也就是将列的值作为列名称),通常我都是用 CASE END + 聚合函数来实现的. 如下: declare @t table (StudentName nvarchar(20), Subject nvarchar(20), Score int) Insert into @t (StudentName,Subject,Score) values ( '学生A', '中文', 80 ); Insert into @t (StudentName,Subject,Score)

sql行列旋转

一,行转列 先建立测试数据 if OBJECT_ID('week_income') is not null drop table week_income go create table week_income ( employee varchar(10), weekname varchar(10), income int ) go insert into week_income select '張三','星期一',1000 union all select '張三','星期二',2000 uni

sql行列转换

首先我们建立一张表,名为RToC,各个字段的设计如下图,分别是name,course,score,表示姓名,成绩与分数,如图所示. 2 我们往表中加入数据,分别添加小明与小花的语文和数学成绩,如图所示. 3 接下来,我们要进行行列转换,列应该是name,语文,数学.我们首先要考虑是如何得到列名,我们可以通过分组得到课程名称.如图所示,我们通过分组语句,从查询结果我们可以看出课程名的拼接字符串. 代码: declare @sql varchar(200) select @sql=ISNULL(@s

oracle进阶篇--行列互转

目前行列转换包括以下六种情况: 1.*列转行 2.*行转列 3.*多列转换成字符串 4.*多行转换成字符串 5.*字符串转换成多列 6.*字符串转换成多行 讨论的适用范围只包括8i,9i,10g及以后版本.begin: 1.列转行 CREATE TABLE t_col_row( ID INT, c1 VARCHAR2(10), c2 VARCHAR2(10), c3 VARCHAR2(10)); INSERT INTO t_col_row VALUES (1, 'v11', 'v21', 'v3