在本文中,我们将给您介绍关于SQLSERVER行转列的详细内容,并且为您解答sqlserver行转列,逗号分隔的相关问题,此外,我们还将为您提供关于55.SQLserver行转列、MSSQLServe
在本文中,我们将给您介绍关于SQLSERVER 行转列的详细内容,并且为您解答sqlserver行转列,逗号分隔的相关问题,此外,我们还将为您提供关于55.SQL server 行转列、MS SQL Server 行转列的总结、mssql sqlserver 不固定行转列数据(动态列)、SQL Server table 行转列的sql分析的知识。
本文目录一览:- SQLSERVER 行转列(sqlserver行转列,逗号分隔)
- 55.SQL server 行转列
- MS SQL Server 行转列的总结
- mssql sqlserver 不固定行转列数据(动态列)
- SQL Server table 行转列的sql分析
SQLSERVER 行转列(sqlserver行转列,逗号分隔)
有如下表SUBJECT(含ID,NAME列)
想得到1,2,3,4,5这样的数据,可以用如下sql
select ','+CAST(ID AS VARCHAR) from subject for xml path('')
将第一个','去掉即可,可以使用如下sql
SELECT stuff((select ','+CAST(ID AS VARCHAR) from subject for xml path('')),1,'') ids
结果如下:
55.SQL server 行转列
select * from (select b.site_name as name,a.site_code as code,monitor_factor_code as monitor_factor_code,revised_monitor_value as monitor_value from t_dusty_monitor_factor_rtdata_inquire a left join t_dusty_basicinfo b
on a.site_code = b.site_code where monitor_factor_code in (''985'',''986'',''984''))tb
pivot (
max(monitor_value) for
monitor_factor_code in ([985],[986],[984])
) b
select * from (
select t.site_code,t.monitor_factor_code as monitor_factor_code ,revised_monitor_value as monitor_value from t_dusty_monitor_factor_rtdata t where t.site_code=''100028'') a
pivot (
max(monitor_value) for
monitor_factor_code in ([985],[986],[987])
) b
order by site_code asc
MS SQL Server 行转列的总结

一直在找一个比较参数化的 行转列算法 (一个老话题了)今天看到一篇文章比较全面的介绍了的应用。
样本数据如图:
方法一:使用拼接 SQL,静态列字段;
方法二:使用拼接 SQL,动态列字段;
方法三:使用 PIVOT 关系运算符,静态列字段;
方法四:使用 PIVOT 关系运算符,动态列字段;
方法一:
SELECT [UserName],
SUM(CASE [Subject] WHEN ''数学'' THEN [Source] ELSE 0 END) AS ''[数学]'',
SUM(CASE [Subject] WHEN ''英语'' THEN [Source] ELSE 0 END) AS ''[英语]'',
SUM(CASE [Subject] WHEN ''语文'' THEN [Source] ELSE 0 END) AS ''[语文]''
FROM [TestRows2Columns]
GROUP BY [UserName]
GO
结果:
方法二:
DECLARE @sql VARCHAR(8000)
SET @sql = ''SELECT [UserName],''
SELECT @sql = @sql + ''SUM(CASE [Subject] WHEN ''''''+[Subject]+'''''' THEN [Source] ELSE 0 END) AS ''''''+QUOTENAME([Subject])+'''''',''
FROM (SELECT DISTINCT [Subject] FROM [TestRows2Columns]) AS a
SELECT @sql = LEFT(@sql,LEN(@sql)-1) + '' FROM [TestRows2Columns] GROUP BY [UserName]''
PRINT(@sql)
EXEC(@sql)
GO
方法三:
SELECT *
FROM ( SELECT [UserName] ,
[Subject] ,
[Source]
FROM [TestRows2Columns]
) p PIVOT
( SUM([Source]) FOR [Subject] IN ( [数学],[英语],[语文] ) ) AS pvt
ORDER BY pvt.[UserName];
GO
方法四:各种必要的表名、分组列、行转列字段、字段值都已经参数化,直接修改就行 作者:<听风吹雨>
DECLARE @sql_str NVARCHAR(MAX)
DECLARE @sql_col NVARCHAR(MAX)
DECLARE @tableName SYSNAME --行转列表
DECLARE @groupColumn SYSNAME --分组字段
DECLARE @row2column SYSNAME --行变列的字段
DECLARE @row2columnValue SYSNAME --行变列值的字段
SET @tableName = ''TestRows2Columns''
SET @groupColumn = ''UserName''
SET @row2column = ''Subject''
SET @row2columnValue = ''Source''
--从行数据中获取可能存在的列
SET @sql_str = N''
SELECT @sql_col_out = ISNULL(@sql_col_out + '''','''','''''''') + QUOTENAME([''+@row2column+''])
FROM [''+@tableName+''] GROUP BY [''+@row2column+'']''
--PRINT @sql_str
EXEC sp_executesql @sql_str,N''@sql_col_out NVARCHAR(MAX) OUTPUT'',@sql_col_out=@sql_col OUTPUT
--PRINT @sql_col
SET @sql_str = N''
SELECT * FROM (
SELECT [''+@groupColumn+''],[''+@row2column+''],[''+@row2columnValue+''] FROM [''+@tableName+'']) p PIVOT
(SUM([''+@row2columnValue+'']) FOR [''+@row2column+''] IN ( ''+ @sql_col +'') ) AS pvt
ORDER BY pvt.[''+@groupColumn+'']''
--PRINT (@sql_str)
EXEC (@sql_str)
各参数的说明入下图:
这个方法还有一个进阶版就是加入了查询条件:
DECLARE @sql_str NVARCHAR(MAX)
DECLARE @sql_col NVARCHAR(MAX)
DECLARE @sql_where NVARCHAR(MAX)
DECLARE @tableName SYSNAME --行转列表
DECLARE @groupColumn SYSNAME --分组字段
DECLARE @row2column SYSNAME --行变列的字段
DECLARE @row2columnValue SYSNAME --行变列值的字段
SET @tableName = ''TestRows2Columns''
SET @groupColumn = ''UserName''
SET @row2column = ''Subject''
SET @row2columnValue = ''Source''
SET @sql_where = ''WHERE UserName = ''''王五'''''' --过滤条件
--从行数据中获取可能存在的列
SET @sql_str = N''
SELECT @sql_col_out = ISNULL(@sql_col_out + '''','''','''''''') + QUOTENAME([''+@row2column+''])
FROM [''+@tableName+''] ''+@sql_where+'' GROUP BY [''+@row2column+'']''
--PRINT @sql_str
EXEC sp_executesql @sql_str,N''@sql_col_out NVARCHAR(MAX) OUTPUT'',@sql_col_out=@sql_col OUTPUT
--PRINT @sql_col
SET @sql_str = N''
SELECT * FROM (
SELECT [''+@groupColumn+''],[''+@row2column+''],[''+@row2columnValue+''] FROM [''+@tableName+'']''+@sql_where+'') p PIVOT
(SUM([''+@row2columnValue+'']) FOR [''+@row2column+''] IN ( ''+ @sql_col +'') ) AS pvt
ORDER BY pvt.[''+@groupColumn+'']''
--PRINT (@sql_str)
EXEC (@sql_str)
结果如图:
部分内容源自于听风吹雨
mssql sqlserver 不固定行转列数据(动态列)
转自:http://www.maomao365.com/?p=5471
摘要:
下文主要讲述动态行列转换语句,列名会根据行数据的不同,
动态的发生变化
----------------------------------------------------
实现思路:
主要将待生成的动态列名,采用脚本拼接起来,然后采用pivot函数
运行,得到相应的结果
本脚本运行环境:
sql server 2008
/*生成源数据表*/ create table #t (compname varchar(20),cheXi varchar(30),dayInfo int,daySaleValue int) /*生成源数据*/ insert into #t(compname,cheXi,dayInfo,daySaleValue) values(‘一汽丰田‘,‘锐志‘,‘1‘,20) insert into #t(compname,‘皇冠‘,10) insert into #t(compname,‘霸道‘,‘2‘,30) insert into #t(compname,‘3‘,40) insert into #t(compname,‘RAV4‘,‘4‘,60) insert into #t(compname,‘5‘,8) insert into #t(compname,‘6‘,6) insert into #t(compname,9) insert into #t(compname,‘10‘,10) /* select * from (select compname,daySaleValue,chexi from #t) as d /*注意事项: pivot所涉及的聚合列 value_column 和 pivot_column 都必须存在 上面的查询表中 */ pivot(sum(daySaleValue) for dayInfo in([1],[2],[3],[4],[5],[6],[7],[8],[9],[10])) t ; */ /*拼接字符串*/ declare @sql varchar(max) set @sql =‘ select * from (select compname,chexi from #t) as d pivot(sum(daySaleValue) for dayInfo in( ‘; /*动态组合列名*/ declare @lieMing varchar(7000) ---定义动态生成列名存放变量 declare @i int,@imax int,@field varchar(60) ---定义临时循环变量 declare @fieldList table(keyId int identity,field varchar(60)) ---定义临时表,存放待生成动态列名的数据 insert into @fieldList(field) select distinct dayInfo from #t ---生成列名数据 -------------循环表生成列名start-------------- set @lieMing =‘‘ set @i=1 select @imax =max(keyId) from @fieldList t while @i <@imax begin select @field =field from @fieldList t where t.keyId=@i if isnull(@field,‘‘) !=‘‘ begin if @lieMing !=‘‘ begin set @lieMing =@lieMing +‘,‘ end set @lieMing = @lieMing+‘[‘+@field+‘]‘; end set @i=@i+1 end -------------循环表生成列名end-------------- /*动态组合列*/ set @sql =@sql +@lieMing +‘ )) t ;‘; ---拼接sql语句 exec (@sql) ---执行sql脚本,生成相关数据 truncate table #t drop table #t
SQL Server table 行转列的sql分析
感兴趣的小伙伴,下面一起跟随小编 jb51.cc的小编两巴掌来看看吧!
一、要求1 创建数据表
CREATE TABLE [dbo].[Stuscore](
[stuid] [int] NOT NULL,
[subject] [nvarchar](30) NULL,
[score] [decimal](5,1) NULL
)
2 插入测试数据
stuid subject score
3 chinese 76.0
3 math 73.0
4 chinese 82.0
5 chinese 66.0
5 math 93.0
6 chinese 67.0
7 math 83.0
8 chinese 77.0
8 math 84.0
3 行转列后的结果
stuid chinese math
3 76.0 73.0
4 82.0 0.0
5 66.0 93.0
6 67.0 0.0
7 0.0 83.0
8 77.0 84.0
二 、分析
1 行转列,一个重点就是怎么样知道有多少列,怎么样创建这些列?我们可以先把这个问题搁置,而假设这些列是已知的。 例如示例数据中,可以先假设subject的数据[chinese,math]是已知的,这样问题就简化了许多
2 当已知了chinese,math后,我们至少要先得到转换后的tabel结构
如下;
select stuid,0 as chinese,0 as math from dbo.Stuscore
结果如下
stuid chinese math
3 0 0
3 0 0
4 0 0
5 0 0
5 0 0
6 0 0
7 0 0
8 0 0
8 0 0
3 接着就需要往这个数据集中去填充chinese,math的数据
select stuid,
case subject when 'chinese' then score else 0 end as chinese,
case subject when 'math' then score else 0 end as math
from dbo.Stuscore
结果如下:
stuid chinese math
3 76.0 0.0
3 0.0 73.0
4 82.0 0.0
5 66.0 0.0
5 0.0 93.0
6 67.0 0.0
7 0.0 83.0
8 77.0 0.0
8 0.0 84.0
4 细心的读者会发现步骤3中的结果与我们想要的已经非常接近了,只需再做一个sum()处理,就OK了
select stuid,
sum(case subject when 'chinese' then score else 0 end ) as chinese,
sum(case subject when 'math' then score else 0 end ) as math
from dbo.Stuscore group by stuid
得到的正是我们想要的结果
stuid chinese math
3 76.0 73.0
4 82.0 0.0
5 66.0 93.0
6 67.0 0.0
7 0.0 83.0
8 77.0 84.0
是不是现在就已经完成了呢?答案是否定的。前面我们已经说过,是为了简化问题,在假设已经知道了subject数据的情况下,这么处理的,实际上subject的数据是可变的,未知的,接下来就是要解决这个问题了
5 要获取subject的数据其实很简单
select distinct subject from dbo.Stuscore
获取以后怎样得到case subject when 'chinese' then score else 0 end 这种语句?
可以根据subject的值去动态的组sql语句
看下面的一段代码
declare @sql varchar(2000)
set @sql=''
select @sql =@sql+ ',case subject when '''+subject+''' then 1 else 0 end as ' + subject
from (select distinct subject from dbo.Stuscore) as sub
print @sql
message打印的信息如下:
,case subject when 'chinese' then 1 else 0 end as chinese,case subject when 'math' then 1 else 0 end as math
6 最后我们就需要将前面步骤综合起来,得到最终的sql
declare @sql varchar(2000)
set @sql='select stuid'
select @sql =@sql+ ',sum(case subject when '''+subject+''' then score else 0 end) as ' + subject
from (select distinct subject from dbo.Stuscore) as sub
set @sql=@sql + ' from dbo.Stuscore group by stuid'
exec(@sql)
stuid chinese math
3 76.0 73.0
4 82.0 0.0
5 66.0 93.0
6 67.0 0.0
7 0.0 83.0
8 77.0 84.0
至此,整个分析过程和结果就都出来了。
初试写文章, 多包涵,指正。
今天关于SQLSERVER 行转列和sqlserver行转列,逗号分隔的讲解已经结束,谢谢您的阅读,如果想了解更多关于55.SQL server 行转列、MS SQL Server 行转列的总结、mssql sqlserver 不固定行转列数据(动态列)、SQL Server table 行转列的sql分析的相关知识,请在本站搜索。
本文标签: