SQL里动态生成列
2015-08-07 15:02
281 查看
一般这种比较复杂一点都用一个存储过程来写比较好。因为单一的视图不能满足我们的需求。
![](http://img.blog.csdn.net/20150807150344102?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
类似这种,有规律可循的列。如果按照原始的方法 case、、、、when 、、、、then 、、、、、、end。我估计是又繁琐又累,纯粹的体力活啊。其实我最开始的时候就是酱写的
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
哈哈~~~~~~~~
不过好在有大神师傅的指点,简单多了,而且这个区间值是可以改变的。代码如下
首先在存过程里定义几个初始变量:
declare @step int--步长
declare @start int--开始值
declare @end int--结束值
set @start=0
set @end=25
set @step=1
然后我们动态的生成这个配置表
--生成配置表
create table #colunm ([id] int null,start int null,[end] int null,name nvarchar(50) null )
declare @row int = 1
WHILE @start<@end
BEGIN
declare @now int
set @now = @start + @step
INSERT INTO #colunm
SELECT @row ,@start,@now,CAST(@start AS VARCHAR(10))+'-'+CAST(@now AS VARCHAR(10))+'%'
SET @start += @step
SET @row += 1
END
INSERT INTO #colunm
SELECT @row+1 ,@end,'',cast(@end as nvarchar(10) )+'%以上'
表给我说看不懂哦, #colunm介货是临时表,是SQL基础知识 不解释。
存储动态列的临时表已经生成了,那么下一步就是根据这个动态列表来获取最终的结果集。
--动态行列转换 生成最终数据集
declare @sql nvarchar(max) = 'select 你需要的列名 ' +char(10)--知道介个char(10)是干撒的不?介个是表示换行的,打印出来的时候方便我们检查SQL语句是不是对滴
select @sql = @sql + ',' + ' sum( (case when a.step = '+cast(a.id as nvarchar(10) )+' then a.con else 0 end) ) '+a.name+' ' +char(10)
from #colunm a
order by a.id
select @sql = @sql + ' from #result a group by 列名 '
print @sql
exec(@sql)
这个其实大家很容易看出来,是求的个数。求其他的大家可以根据自己的需求来。
类似这种,有规律可循的列。如果按照原始的方法 case、、、、when 、、、、then 、、、、、、end。我估计是又繁琐又累,纯粹的体力活啊。其实我最开始的时候就是酱写的
![](http://static.blog.csdn.net/xheditor/xheditor_emot/default/laugh.gif)
哈哈~~~~~~~~
不过好在有大神师傅的指点,简单多了,而且这个区间值是可以改变的。代码如下
首先在存过程里定义几个初始变量:
declare @step int--步长
declare @start int--开始值
declare @end int--结束值
set @start=0
set @end=25
set @step=1
然后我们动态的生成这个配置表
--生成配置表
create table #colunm ([id] int null,start int null,[end] int null,name nvarchar(50) null )
declare @row int = 1
WHILE @start<@end
BEGIN
declare @now int
set @now = @start + @step
INSERT INTO #colunm
SELECT @row ,@start,@now,CAST(@start AS VARCHAR(10))+'-'+CAST(@now AS VARCHAR(10))+'%'
SET @start += @step
SET @row += 1
END
INSERT INTO #colunm
SELECT @row+1 ,@end,'',cast(@end as nvarchar(10) )+'%以上'
表给我说看不懂哦, #colunm介货是临时表,是SQL基础知识 不解释。
存储动态列的临时表已经生成了,那么下一步就是根据这个动态列表来获取最终的结果集。
--动态行列转换 生成最终数据集
declare @sql nvarchar(max) = 'select 你需要的列名 ' +char(10)--知道介个char(10)是干撒的不?介个是表示换行的,打印出来的时候方便我们检查SQL语句是不是对滴
select @sql = @sql + ',' + ' sum( (case when a.step = '+cast(a.id as nvarchar(10) )+' then a.con else 0 end) ) '+a.name+' ' +char(10)
from #colunm a
order by a.id
select @sql = @sql + ' from #result a group by 列名 '
print @sql
exec(@sql)
这个其实大家很容易看出来,是求的个数。求其他的大家可以根据自己的需求来。
相关文章推荐
- 控制台应用程序连接数据库
- SQL公用方法-根据日期格式字符串返回年季度开始和结束日期
- Oracle Clob使用
- redis 在linux下的安装
- MySql绿色版安装配置
- SQL公用方法-根据字符串拆分成数组
- 1、redis之安装与配置
- SQL公用方法-根据拆封成表,并返回表结果
- 【MSSQL教程】#001 整体思维导图
- Mysql校验规则
- MAC下安装与配置MySQL
- 系统默认ORACLE用户及口令
- mysql Access denied for user root@localhost错误解决方法总结(转)
- mysqlimport
- 数据库索引以及优化
- MongoDB常用操作对比T-Sql
- Sqlite介绍及其语句
- 数据库表的查询操作(实验二)
- 深入了解sql语句以及应用实例
- Oracle to_date()函数的用法