GVKun编程网logo

SQLSERVER 行转列(sqlserver行转列,逗号分隔)

10

在本文中,我们将给您介绍关于SQLSERVER行转列的详细内容,并且为您解答sqlserver行转列,逗号分隔的相关问题,此外,我们还将为您提供关于55.SQLserver行转列、MSSQLServe

在本文中,我们将给您介绍关于SQLSERVER 行转列的详细内容,并且为您解答sqlserver行转列,逗号分隔的相关问题,此外,我们还将为您提供关于55.SQL server 行转列、MS SQL Server 行转列的总结、mssql sqlserver 不固定行转列数据(动态列)、SQL Server table 行转列的sql分析的知识。

本文目录一览:

SQLSERVER 行转列(sqlserver行转列,逗号分隔)

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 行转列

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 行转列的总结

MS SQL Server 行转列的总结

OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代

一直在找一个比较参数化的 行转列算法 (一个老话题了)今天看到一篇文章比较全面的介绍了的应用。

样本数据如图:

 

     方法一:使用拼接 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 不固定行转列数据(动态列)

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分析

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分析的相关知识,请在本站搜索。

本文标签: