数据库类似行列转换SQL

1、原表test结构如下:

2、我们想要得到的结果为:

3、第一种方法:静态方法,即列固定

SQL如下:

select * from 
(
SELECT date,name,sum(num) num FROM test  GROUP BY date,name
) t
pivot ( sum(num) for t.name in ([alan],[andy],[baicl])) as a

4、第二种方法:动态方法,即列为通过SQL查询获取

SQL如下:

declare @sql nvarchar(4000)

select @sql=isnull(@sql+‘,‘,‘‘)+t.name

from (select distinct quotename(name) as name from test) t

set @sql=‘select * from (SELECT date,name,sum(num) num FROM test  GROUP BY date,name) t pivot ( sum(num) for t.name in (‘[email protected]+‘)) as a‘

exec(@sql)
时间: 2024-11-07 13:49:49

数据库类似行列转换SQL的相关文章

数据库的行列转换问题

在平常的工作中或者面试中,我们可能有遇到过数据库的行列转换问题.今天我们就来讨论下. 1.创建表 首先我们来创建一张表. sql语句: --1. 创建数据表 if OBJECT_ID('Score') is not null drop table Score create table Score ( 姓名 nvarchar(128), 课程 nvarchar(128), 分数 int ) insert into Score values('张三','语文',98) insert into Sco

通过sql做数据透视表,数据库表行列转换(pivot和Unpivot用法)(一)

在mssql中大家都知道可以使用pivot来统计数据,实现像excel的透视表功能 一.MSsqlserver中我们通常的用法 1.Sqlserver数据库测试 ---创建测试表 Create table s( [name] nvarchar(50), book nvarchar(50), saledNumber int ) ----插入测试数据 insert into s ([name],book,saledNumber) values('小王','java从入门到精通',10); inser

简单的数据库表行列转换实例

原表如下: 列转行: select 姓名, MAX(CASE 课程 when '语文' then 分数 else 0 END) 语文, MAX(CASE 课程 when '数学' then 分数 else 0 END) 数学, MAX(CASE 课程 when '物理' then 分数 else 0 END) 物理from 成绩 GROUP BY 姓名 得到如下结果: 反过来,行转列: select * from ( select 姓名,'语文' 课程, 语文 分数 from 成绩2 UNION

SqlServer2000下实现行列转换

SqlServer2000下实现行列转换 2011-04-06 22:07:07|  分类: SQL Server |  标签:sqlserver  2000  行列转换  sql  |举报|字号 订阅 create table tb(姓名 nvarchar(50),课程 nvarchar(50),分数 int) insert into tb values('张三' , '语文' , 74)insert into tb values('张三' , '数学' , 83)insert into tb

使用分析函数进行行列转换

其实使用分析函数进行处理是很好的方式,翻一下Tom的书,将其中的一个例子收录在这里. 比如查询scott.emp表的用户SAL排序信息,可以使用如下查询: SQL> SELECT deptno, ename, 2 ROW_NUMBER () OVER (PARTITION BY deptno ORDER BY sal DESC) seq 3 FROM emp; DEPTNO ENAME SEQ ---------- ---------- ---------- 10 KING 1 10 CLARK

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 Server中行列转换 Pivot UnPivot

SQL Server中行列转换 Pivot UnPivot PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (-) )AS P 完整语法: table_source PIVOT( 聚合函数(value_column) FOR pivot_column IN(<column_list>) ) UNPIVOT用于将列明转为列值(即列转行),在SQL Server 2

SQL Fundamentals: 子查询 || 行列转换(PIVOT,UNPIVOT,DECODE),设置数据层次(LEVEL...CONNECT BY)

SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5.在SELECT子句中使用子查询 6.WITH子句 子查询(进阶) 7.分析函数 8.行列转换 9.设置数据层次 八.行列转换 pivot和unpivot函数是Oracle 11g增加的新函数,利用此函数可以实现行列转换操作 按照原始方式实现,使用通用函数中的DECODE()函数 列字段的处理 SQ

一道面试题引发的数据库行列转换实践

问题场景 最近有个朋友去面试,问了我一道面试题.题目如下,在形如下面的数据库表score中,找出每门成绩(grade)都大于等于80分的学生姓名. ---------------------------------------- name     | course  | grade ---------------------------------------- zhangsan  | Java  | 70 ---------------------------------------- zha