`
fangbiao23
  • 浏览: 41297 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

如何实现MSSQL数据表行列转换

阅读更多

 

在做报表应用时,总是要涉及行行色色的数据操作,如题,就是一个很好的例子:

一、为了实现数据表行列转换,首先我们来创建一个数据表

CREATE TABLE MYTABLE

(

   myId int identity(1,1) constraint pk_myId primary  key,

   bookName varchar(50) not null,

   bookAuthor varchar(20) not null,

   bookPubDate datetime default getdate(),
  
   bookSaleA int ,

   bookSaleB int ,
  
   bookSaleC int

)

GO

INSERT INTO MYTABLE

   SELECT 'Spring入门','小孟',getDate(),54,52,48
      UNION ALL
   SELECT 'Spring进阶','小孟',getDate(),64,62,58
      UNION ALL
   SELECT 'proxool进阶','小刘',getDate(),33,32,28
      UNION ALL
   SELECT '加强oracle','孟进',getDate(),61,58,58
      UNION ALL
   SELECT '中国之象','刘自明',getDate(),133,132,128
      UNION ALL
   SELECT '加强MSSQL','孟进',getDate(),51,48,38

GO

SELECT * FROM MYTABLE

GO

显示的表数据为:

bookName    bookAuthor     bookPubDate        bookSaleA     bookSaleB    bookSaleC
Spring入门    小孟    2007-06-15 17:26:53.793   54           52             48 
Spring进阶    小孟    2007-06-15 17:26:53.793   64           62             58 
proxool进阶   小刘    2007-06-15 17:26:53.793   33           32             28 
加强oracle    孟进    2007-06-15 17:26:53.793   61           58             58 
中国之象     刘自明   2007-06-15 17:26:53.793   133          132            128 
加强MSSQL     孟进    2007-06-15 17:26:53.793   51           48             38 

二、自问:如果要把bookAuthor的列数据转换为行时,应该如何实现呢?

  
DECLARE @SQL VARCHAR(8000)  --为何要定义这么大呢?当你的列记录多的时候你就知道

SET @SQL = 'SELECT '  --SET 用于单行记录

SELECT @SQL = @SQL +  ' CASE bookAuthor when '''+bookAuthor+''' THEN 1 END ['+bookAuthor+'] ,' FROM (SELECT DISTINCT bookAuthor FROM MYTABLE)  AS TEMPTABLE --SELECT用于单行或者多行记录

SELECT @SQL = LEFT(@SQL,LEN(@SQL)-1) + 'INTO ##MYTABLETEMP FROM MYTABLE'

EXEC(@SQL)

SELECT * FROM ##MYTABLEtEMP

DROP TABLE ##MYTABLETEMP 

GO

查询结果:

刘自明  孟进  小刘  小孟

NULL   NULL   NULL   1
NULL   NULL   NULL   1
NULL   NULL   1      NULL
NULL   1      NULL   NULL
1      NULL   NULL   NULL
NULL   1      NULL   NULL

这样我们就实现了列到行的转换。

三、自问,既然能做到列到行的转换,那反之又如何呢?

我们将用列bookSaleA、bookSaleB、bookSaleC的数据转换为bookSaleAll列

DECLARE @SQL VARCHAR(8000)  --为何要定义这么大呢?当你的列记录多的时候你就知道

SET @SQL = '' --记得哦

SELECT @SQL = 'SELECT '''+name+''' AS bookSaleAll FROM MYTABLE UNION ALL '

             FROM syscolumns WHERE ColID LIKE 'bookSale%' ORDER BY ColID

SELECT @SQL = LEFT(@SQL,LEN(@SQL)-8)

EXEC(@SQL)

GO

注:

如果在列转为行时要把多行的数据压为一行,则需要使用max函数,如:

DECLARE @SQL VARCHAR(8000)  --为何要定义这么大呢?当你的列记录多的时候你就知道

SET @SQL = 'SELECT distinct  '  --SET 用于单行记录

SELECT @SQL = @SQL +  'max(CASE imgAppPageId when '''+imgAppPageId+''' THEN imgAppPageId else '''' END) ['+imgAppPageId+'] ,'
  FROM (SELECT DISTINCT imgAppPageId FROM PageImageTable )   AS TEMPTABLE --SELECT用于单行或者多行记录

print(@SQL)

SELECT @SQL = LEFT(@SQL,LEN(@SQL)-1) + 'INTO ##MYTABLETEMP FROM  PageImageTable '

print(@SQL)

EXEC(@SQL)

print(@SQL)

SELECT *  FROM ##MYTABLEtEMP 

DROP TABLE ##MYTABLETEMP 
 

分享到:
评论

相关推荐

    目标量拆解入库.ktr

    通过kettle实现excel读取、行列转换、字段规整。实现关系型数据结构,便于其他程序使用。

    经典SQL脚本大全

    │ │ 8.2.5 校验表中数据是否有循环编码的通用存储过程.sql │ │ 8.2.6 复制指定节点及其所有子节点到指定结点的处理示例(借鉴方式排序法).sql │ │ 8.2.6 复制指定节点及其所有子节点到指定结点的处理示例.sql ...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例043 将二维数组中的行列互换 53 实例044 利用数组随机抽取幸运观众 54 实例045 用数组设置JTable表格的列名与列宽 55 3.2 数组操作 57 实例046 数组的下标界限 57 实例047 按钮控件数组实现计数器界面 58 实例...

    Sqlserver2000经典脚本

    │ └─其他 │ 交叉表--复杂名次.sql │ 交叉表-优先级处理.sql │ 交叉表分析.sql │ 分级汇总.sql │ 分组交叉表.sql │ 列转行.sql │ 固定行列报表.sql │ 复杂交叉表....

    asp.net知识库

    根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 生成器 将表数据生成SQL脚本的存储过程 直接从SQL语句问题贴子数据建表并生成建表语句的存储过程 从SQL中的一个表中导出HTML文件...

    易语言程序免安装版下载

     为实现静态编译,易语言编译器、核心支持库、集成开发环境(IDE)等均有重大更新,支持库开发架框有扩展性调整,绝大多数官方支持库都已针对静态编译完成自身改造并提供静态库。  目前绝大多数官方支持库均已支持...

    Eclipse_Swt_Jface_核心应用_部分19

    7.3 RowLayout(行列式布局) 102 7.3.1 设置折行显示:wrap属性 103 7.3.2 设置空间大小:pack属性 103 7.3.3 设置填充方式:type属性 103 7.3.4 设置是否充满整行:justify属性 104 7.3.5 设置补白和...

    sqltoy-orm框架系统-其他

    6、提供行列转换(数据旋转),避免写复杂的sql或存储过程,用算法来化解对sql的高要求,同时实现数据库无关(不管是mysql还是sqlserver) 7、提供分组汇总求平均算法(用算法代替sql避免跨数据库语法不一致) 8、分库分表...

    cmd操作命令和linux命令大全收集

    tlist -t 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内) kill -F 进程名 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/...

    PHP基础教程 是一个比较有价值的PHP新手教程!

    本教程并不想让你完全了解这种语言,只是能使你尽快加入开发动态web站点的行列。我假定你有一些HTML(或者HTML编辑器)的基本知识和一些编程思想。 1.简介 PHP是能让你生成动态网页的工具之一。PHP网页文件被当作...

    Linux操作系统基础教程

    Linux 操作系统基础教程 清华大学信息学院计算机系 目 录 前言....................................................................................数据量,而一个完整的发行版本大概都是 1Gbit 左右的数据量...

Global site tag (gtag.js) - Google Analytics