在做报表应用时,总是要涉及行行色色的数据操作,如题,就是一个很好的例子:
一、为了实现数据表行列转换,首先我们来创建一个数据表
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
相关推荐
通过kettle实现excel读取、行列转换、字段规整。实现关系型数据结构,便于其他程序使用。
│ │ 8.2.5 校验表中数据是否有循环编码的通用存储过程.sql │ │ 8.2.6 复制指定节点及其所有子节点到指定结点的处理示例(借鉴方式排序法).sql │ │ 8.2.6 复制指定节点及其所有子节点到指定结点的处理示例.sql ...
实例043 将二维数组中的行列互换 53 实例044 利用数组随机抽取幸运观众 54 实例045 用数组设置JTable表格的列名与列宽 55 3.2 数组操作 57 实例046 数组的下标界限 57 实例047 按钮控件数组实现计数器界面 58 实例...
│ └─其他 │ 交叉表--复杂名次.sql │ 交叉表-优先级处理.sql │ 交叉表分析.sql │ 分级汇总.sql │ 分组交叉表.sql │ 列转行.sql │ 固定行列报表.sql │ 复杂交叉表....
根据基本表结构及其数据生成 INSERT ... 的 SQL 简便的MS SQL 数据库 表内容 脚本 生成器 将表数据生成SQL脚本的存储过程 直接从SQL语句问题贴子数据建表并生成建表语句的存储过程 从SQL中的一个表中导出HTML文件...
为实现静态编译,易语言编译器、核心支持库、集成开发环境(IDE)等均有重大更新,支持库开发架框有扩展性调整,绝大多数官方支持库都已针对静态编译完成自身改造并提供静态库。 目前绝大多数官方支持库均已支持...
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 设置补白和...
6、提供行列转换(数据旋转),避免写复杂的sql或存储过程,用算法来化解对sql的高要求,同时实现数据库无关(不管是mysql还是sqlserver) 7、提供分组汇总求平均算法(用算法代替sql避免跨数据库语法不一致) 8、分库分表...
tlist -t 以树行列表显示进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/tools文件夹内) kill -F 进程名 加-F参数后强制结束某进程(为系统的附加工具,默认是没有安装的,在安装目录的Support/...
本教程并不想让你完全了解这种语言,只是能使你尽快加入开发动态web站点的行列。我假定你有一些HTML(或者HTML编辑器)的基本知识和一些编程思想。 1.简介 PHP是能让你生成动态网页的工具之一。PHP网页文件被当作...
Linux 操作系统基础教程 清华大学信息学院计算机系 目 录 前言....................................................................................数据量,而一个完整的发行版本大概都是 1Gbit 左右的数据量...