您的位置:首页 > 数据库

SQL里动态生成列

2015-08-07 15:02 281 查看
一般这种比较复杂一点都用一个存储过程来写比较好。因为单一的视图不能满足我们的需求。



类似这种,有规律可循的列。如果按照原始的方法 case、、、、when 、、、、then 、、、、、、end。我估计是又繁琐又累,纯粹的体力活啊。其实我最开始的时候就是酱写的


哈哈~~~~~~~~

不过好在有大神师傅的指点,简单多了,而且这个区间值是可以改变的。代码如下

首先在存过程里定义几个初始变量:

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)

这个其实大家很容易看出来,是求的个数。求其他的大家可以根据自己的需求来。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: