从MS Sql Server 2005微软就推出了pivot和unpivot实现行列转换,这极大的方便了我们存储数据和呈现数据。今天就对这两个关键字进行分析,结合实例讲解如何存储数据,如何呈现数据。

例如学生选课和成绩系统中就有一张表,该表存储了学生的课程成绩,我们无法去预料课程的多少,因此一般表会设计为下面这样:

图1

最后一列是课程编号,这样无论开学之后还会不会增加课程供学生选择,都没有关系。那么我们要呈现给用户看的报表一般是这样的:

图2

可以看到存储数据的时候采用的是列式存储,最终呈现的数据是行式显示,如何实现?下面详细分析讲解:

创建表语句

  1. USE [master]
  2. GO
  3.  
  4. /****** Object: Table [dbo].[Table_1] Script Date: 08/06/2013 13:55:39 ******/
  5. SET ANSI_NULLS ON
  6. GO
  7.  
  8. SET QUOTED_IDENTIFIER ON
  9. GO
  10.  
  11. SET ANSI_PADDING ON
  12. GO
  13.  
  14. CREATE TABLE [dbo].[Table_1](
  15. [name] [varchar](50) NOT NULL,
  16. [score] [real] NOT NULL,
  17. [subject_id] [int] NOT NULL
  18. ) ON [PRIMARY]
  19.  
  20. GO
  21.  
  22. SET ANSI_PADDING OFF
  23. GO

插入测试数据

  1. insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( '张三' , 90 , 1 );
  2. insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( '张三' , 80 , 2 );
  3. insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( '张三' , 70 , 3 );
  4. insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( '王五' , 50 , 1 );
  5. insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( '王五' , 40 , 2 );
  6. insert into [master].[dbo].[Table_1] ([name],[score],[subject_id]) values( '李四' , 60 , 1 );

现在查询下Table_1中的数据即为图1中的结果,现在我们要得到图2的结果,那么使用下面的语句:

  1. SELECT [name],[1],[2],[3]
  2. FROM [master].[dbo].[Table_1]
  3. pivot
  4. (
  5. sum(score) for subject_id in ([1],[2],[3])
  6. ) as pvt
  7. GO

如果本身数据库表存储的就是图2那样,要变成图1的方式呈现,那就需要用unpivot,可以这样做:

  1. SELECT [name],[subject_id],[score]
  2. FROM
  3. (
  4. SELECT [name],[1],[2],[3]
  5. FROM [master].[dbo].[Table_1]
  6. pivot
  7. (
  8. sum(score) for subject_id in ([1],[2],[3])
  9. ) as pvt
  10. ) p
  11. unpivot
  12. (
  13. score for subject_id in([1],[2],[3])
  14. ) as unpvt

当然我还是在Table_1的基础上先用pvt转为为行式存储的方式,再用unpivot进行列式呈现。

Sql实现行列转换的更多相关文章

  1. SQL Server 行列转换

    /* 标题:普通行列转换(version 2.0) 作者:范中磊 说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql ...

  2. PL/SQL 实现行列转换

    这篇博文写的是简单的行列转换的,以一个具体的例子来给出. 以前在论坛上有人问过相关的问题,上面的回答五光十色,有很多是可行的,当然更多的是自以为很高端,实际却不着边际的回答.下面进入正题. part1 ...

  3. [转载]SQL Server行列转换实现

    可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_source PIVOT( 聚合函数(value_ ...

  4. Sql的行列转换

    创建表scores 一.传统的行列转换 纵表转横表 我们要转成的横表是这样子的: pivot是sql server 2005 提供的运算符,所以只要数据库在05版本以上的都可以使用.主要用于行和列的转 ...

  5. 简单的叙述下SQL中行列转换的小知识!

    行列转换对于工作还是学习中总是不可避免的会遇到(虽然本人还尚未工作,萌萌哒的学生一枚),解决的方法也有很多,我这里就总结一下我所想解决的问题以及怎么去解决的方法, 可能网上已经有很多类似的方法了,有的 ...

  6. 12、SQL Server 行列转换

    SQL Server 行转列 在SQL Server 2005中PIVOT 用于将列值转换为列名(行转列),在SQL Server 2000中是没有这个关键字的 只能用case语句实现. --创建测试 ...

  7. SQL SERVER 行列转换(动态)

    行转列测试数据: --测试数据 if not object_id(N'Tempdb..#T') is null drop table #T Go Create table #T([Name] nvar ...

  8. SQL中行列转换Pivot

    --建表 ),课程 ),分数 int) --插入数据 ) ) ) ) ) ) 1.静态行转列(确定有哪些列) select 姓名, end)语文, end)数学, end)物理 from tb gro ...

  9. sql通用行列转换

    -- 行转列 select 姓名, SUM(case 课程 when '语文' then 分数 else 0 end) as 语文, SUM(case 课程 when '数学' then 分数 els ...

随机推荐

  1. 從 kernel source code 查出 版本號碼

    kernel/Makefile 1 VERSION = 4 2 PATCHLEVEL = 4 3 SUBLEVEL = 21 4 EXTRAVERSION = 5 NAME = Blurry Fish ...

  2. core dump使用方法、设置、测试用例

    core dump使用方法.设置.测试用例 http://blog.csdn.net/liuzhuchen/article/details/21975227

  3. python 使用headless chrome滚动截图

    from selenium import webdriver from selenium.webdriver.chrome.options import Options import util chr ...

  4. 【模板】BZOJ 1692:队列变换—后缀数组 Suffix Array

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=1692 题意: 给出一个长度为N的字符串,每次可以从串头或串尾取一个字符,添加到新串中,使新串 ...

  5. C基础 算法实现层面套路

    引言 - 从实践狗讲起 理论到实践(有了算法到实现) 中间有很多过程. 算法方面本人啥也不懂, 只能说说实现方面. 例如下面 一个普通的插入排序. // // 插入排序默认从大到小 // extern ...

  6. ASPxTreeList的右键按钮事件

    ASPxTreeList应该是比较长用的控件了~现在就来说说它的右键按钮事件 这里实现的是右键里有折合和展开所有节点的功能 code: <dx:ASPxTreeList ID="ASP ...

  7. jdbc预编译插入数据操作

    package com.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Prepare ...

  8. django给视图添加缓存功能

    在开发过程中,有些视图只是查询数据,而且查询的数据一般不会变化.例如,做地址模块时,省市县都是不会变的.如果用户每次请求地址视图时,都要执行视图返回数据,会给服务端带来不必要的压力.这时候可以用到缓存 ...

  9. java 执行 class

    run.sh: #!/bin/bash CLASSPATH=. for jar in *.jar; do CLASSPATH=$CLASSPATH:$jardone CACHE_FILE=`pwd`/ ...

  10. transition结合:after,:before实现动画

    div代码 <div class='div'> hover </div> css代码 .div{ width:200px; height:100px; line-height: ...