当前位置:首页 » 编程语言 » sql对行列进行转化
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql对行列进行转化

发布时间: 2022-06-11 19:48:42

sql行列转换

--测试环境MSSQL2008
--先创建一个表值函数,负责字符串拆分
CreateFunction[dbo].[f_split1](@SourceSqlVarchar(8000),@StrSeprateVarchar(2))
Returns@tempTable(idIntIdentity(1,1),colVarchar(100))
As
begin
Declare@chasVarchar(100)
Set@SourceSql=@SourceSql+@StrSeprate
While(@SourceSql<>'')
Begin
Set@ch=left(@SourceSql,Charindex(@StrSeprate,@SourceSql,1)-1)
Insert@temp(col)Values(@ch)
Set@SourceSql=Stuff(@SourceSql,1,Charindex(@StrSeprate,@SourceSql,1),'')
End
Return
End
go

--建表
createtable#table(namenvarchar(500),valuenvarchar(max))

--插入数据
insertinto#tablevalues('aaa','45,44,44,44,43,43,43,43,43,43')
insertinto#tablevalues('bbb','45,44,44,44,44,44,44,44,44,43')
insertinto#tablevalues('ccc','13,12,12,12,4')

--由于N不固定,下面就动态生成SQL
Declare@Iint
Declare@WVarchar(1000)=''
Declare@SVarchar(4000)=''
Declare@SqlVarchar(8000)=''
select@I=max(len(value)-len(replace(value,',','')))from#table
While@I>0
Begin
Set@W=',['+Convert(Varchar(10),@I)+']'+@W
Set@S=',['+Convert(Varchar(10),@I)+']AsTop'+Convert(Varchar(10),@I)+@S
Set@I=@I-1
End
Set@Sql='
selectname'+@S+'from#table
outerapplydbo.f_split1(value,'','')
pivot
(
max(col)
For
idin('+stuff(@W,1,1,'')+')
)p
orderbyname'

--执行
Exec(@sql)


❷ sql表行到列的转换

鉴于你已经新建好下面的表了 被我称为tableB的表 前面的原始表称为tableA 那就开始吧
truncate table tableB ---清空tableB的数据先
insert into tableB
(StuCJID,XXBH,语文, 数学, 英语 ,政治)
select StuCJID,XXBH,Score,0,0,0
from tableA where KeCheng='语文' ---把A里面所有语文的记录都插入到B

update a set a.数学=b.Score from tableB a left join tableA b on a.XXBH=b.XXBH
where b.KeCheng='数学' ---对应更新B的数学和A同一个XXBH的人一致
update a set a.英语=b.Score from tableB a left join tableA b on a.XXBH=b.XXBH
where b.KeCheng='英语' ---对应更新B的英语和A同一个XXBH的人一致
update a set a.政治=b.Score from tableB a left join tableA b on a.XXBH=b.XXBH
where b.KeCheng='政治'---对应更新B的政治和A同一个XXBH的人一致

select * from tableB order by XXBH ---查询结果

❸ SQL 行列转换

行列转换等经典SQL语句

1.--行列转换

原表: 姓名 科目 成绩
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 物理 82
李四 英语 90
李四 政治 70
王五 英语 90

转换后的表: 姓名 数学 物理 英语 语文 政治
李四 0 82 90 85 70
王五 0 0 90 0 0
张三 90 85 0 80 0

实例:
create table cj --创建表cj
(
ID Int IDENTITY (1,1) not null, --创建列ID,并且每次新增一条记录就会加1
Name Varchar(50),
Subject Varchar(50),
Result Int,
primary key (ID) --定义ID为表cj的主键
);
--Truncate table cj
--Select * from cj
Insert into cj
Select '张三','语文',80 union all
Select '张三','数学',90 union all
Select '张三','物理',85 union all
Select '李四','语文',85 union all
Select '李四','物理',82 union all
Select '李四','英语',90 union all
Select '李四','政治',70 union all
Select '王五','英语',90
--行列转换
Declare @sql varchar(8000)
Set @sql = 'Select Name as 姓名'
Select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result else 0 end) ['+Subject+']'
from (select distinct Subject from cj) as cj --把所有唯一的科目的名称都列举出来
Select @sql = @sql+' from cj group by name'
Exec (@sql)

2. 行列转换--合并
原表: 班级 学号
1 1
1 2
1 3
2 1
2 2
3 1
转换后的表: 班级 学号
1 1,2,3
2 1,2
3 1

实例:
Create table ClassNo --创建表ClassNo
(
ID Int IDENTITY(1,1) not null, --创建列ID,并且每次新增一条记录就会加1
Class Varchar(50), --班级列
Number Varchar(50), --学号列
Primary Key(ID) --定义ID为表ClassNo的主键
);
--Truncate Table ClassNo
--Select * from ClassNo
Insert Into ClassNo
Select 1,1 Union all
Select 1,2 Union all
Select 1,3 Union all
Select 2,1 Union all
Select 2,2 Union all
Select 3,1

创建一个合并的函数
--Drop Function KFReturn
Create Function KFReturn(@Class Varchar(50))
Returns Varchar(8000)
as
Begin
Declare @str Varchar(8000)
Set @str = ''
Select @str = @str + cast(Number as Varchar(50)) + ',' from ClassNo Where Class = @Class
Set @str = SubString(@str,1,len(@str)-1)
Return(@str)
End

--调用自定义函数得到结果
Select Distinct Class,dbo.KFReturn(Class) From ClassNo

3:列转行
--Drop Table ColumnToRow
Create table ColumnToRow
(
ID Int IDENTITY(1,1) not null, --创建列ID,并且每次新增一条记录就会加1
a int,
b int,
c int,
d int,
e int,
f int,
g int,
h int,
Primary Key(ID) --定义ID为表ColumnToRow的主键
);
--Truncate Table ColumnToRow
--Select * from ColumnToRow
Insert Into ColumnToRow
Select 15,9,1,0,1,2,4,2 Union all
Select 22,34,44,5,6,7,8,7 Union all
Select 33,44,55,66,77,88,99,12

Declare @sql Varchar(8000)
Set @sql = ''
Select @sql = @sql + rtrim(name) + ' from ColumnToRow union all Select ' from SysColumns Where id = object_id('ColumnToRow')
Set @sql = SubString(@sql,1,len(@sql)-70)
--70的长度就是这个字符串'from ColumnToRow union all Select ID from ColumnToRow union all Select ',因为它会把ID这一列的值也算进去,所以要把它截掉
Exec ('Select ' + @sql + ' from ColumnToRow')

❹ 急求:SQL语句进行行列转换!!!

你的这种变化貌似是毫无意义的,或许
你想要的变换时下面的这种情况吧。
******原来的纵表tb*****
学号
科目
成绩
1001
语文
90
1001
数学
80
1001
英语
70
1002
语文
95
1002
数学
85
1002
英语
75
*****目标的横表*****
学号
语文
数学
英语
总分
1001
90
80
70
240
1002
95
85
75
255
sql语句:
select
学号
as
'学号',
sum(case
科目
when
'语文'
then
成绩
else
0
end)
as
'语文',
sum(case
科目
when
'数学'
then
成绩
else
0
end)
as
'数学',
sum(case
科目
when
'英语'
then
成绩
else
0
end)
as
'英语',
sum(case
when
科目!=''
then
成绩
end)
as
'总分'
from
tb
group
by
学号

❺ sql 行列转换

我来说一下:
这个可以写成一句普通的sql,你这写的是动态sql,性能不如普通sql,并且字段名“语文”、“数学”、“物理”,你还无法加上。
一句sql:select 姓名,‘语文’=sum(case 课程 when ‘语文’ then 分数 esle 0 end),‘数学’=sum(case 课程 when ‘数学’ then esle 0 分数 end),‘物理’=sum(case 课程 when ‘物理’ then esle 0 分数 end)from tb group by 姓名
这个其实和他们的差不多,你把这个理想了,你会觉得很简单的,动态sql写的挺复杂的,老实说,我都看不懂,我也懒得看。不理解的问我。
你记住这样一句话:一列数据变成多列数据,用case语句;
一行数据变成多行数据,考虑自连接。

❻ SQL里行列转换

sqlserver2005中可以用
Pivot UnPivot
来实现。

sqlserver2000的话,行数 和列数在数据库中是可变的,恐怕很难实现。想想存储过程+临时表吧。

❼ 写sql,怎么将查询结果的行列转换呀

有意思的问题 给出一个参考的URL: 假设你表是这样的结构部件 入库日期 入库数量 A 1/1 10 A 1/1 5 A 1/2 10 B 1/5 10 其实就是两种方法,假设你的数据库是11以前的,只能先定义好查哪天到哪天 然后那么 selct 部件, sum( decode(入库日期=1号,入库数量,0), sum( decode(入库日期=2号,入库数量,0), 以此类推 from 入库表 group BY 部件(原理上就是将不是这天的变成0,再合计)要是Oracle数据库是11的话,就简单了,直接pivot搞定 pivot语法就不说了,网上一堆一堆的 ~

❽ SQL 进行行列转换

Select
A01出水温度 = ISNULL((Select SetUpName From XXX Where SetupID = 1),0),
A02出水温度 = ISNULL((Select SetUpName From XXX Where SetupID = 2),0),
A03出水温度 = ISNULL((Select SetUpName From XXX Where SetupID = 3),0),
A04出水温度 = ISNULL((Select SetUpName From XXX Where SetupID = 4),0),
.........
OK! 注意:没有From语句

❾ SQL行列转换

SQL2000:

use Tempdb
go
--> -->

if not object_id(N'A') is null
drop table A
Go
Create table A([ID] nvarchar(5),[Name] nvarchar(4),[Age] int,[Sex] nvarchar(10))
Insert A
select N'a01',N'张三',19,N'男' union all
select N'a02',N'李四',20,N'女' union all
select N'a03',N'王五',21,N'男'
Go

if not object_id(N'B') is null
drop table B
Go
Create table B([表名] nvarchar(20),[列名] nvarchar(20),[字段长度] int,[字段组合] nvarchar(10))
Insert B
select N'A',N'ID',5,N'组合' union all
select N'A',N'Name',4,N'中文' union all
select N'A',N'Age',3,N'数字' union all
select N'A',N'Sex',2,N'选择'
Go
--表名='A'(也就是A表), A表的ID='a01'
declare @TableName sysname,@ID nvarchar(10)
select @TableName='A',@ID='a01'

declare @S1 nvarchar(4000)

select @S1=isnull(@S1+' union all ','')+'select [列名]='+quotename(Name,'''')
+',[列字段]= cast('+quotename(Name)+' as nvarchar(10)) from ['+@TableName+'] where ID='''+@ID+''''
from syscolumns where ID=object_id(@TableName)
exec(

'select b.[列名], a.[列字段],b.[字段长度], b.[字段组合] from ('+@S1+N')a inner join B on a.[列名]=b.[列名] where b.[表名]='''+@TableName+'''')

/*
列名 列字段 字段长度 字段组合
ID a01 5 组合
Name 张三 4 中文
Age 19 3 数字
Sex 男 2 选择
*/

❿ sql语句行转列 怎么转啊

--声明变量

declare@sqlvarchar(1000),@num_dataint,@num_allvarchar(2000),@num_numint,@table_sqlvarchar(2000)

set@num_num=0

--判断并创建表

ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[records]')andOBJECTPROPERTY(id,N'IsUserTable')=1)

droptable[dbo].[records]

createtablerecords(

[id]int,

[name]varchar(50),

[sex]varchar(10),

[num]int

)

--插入数据

insertintorecordsvalues(1,'tom','男',2)

insertintorecordsvalues(1,'tom','男',3)

insertintorecordsvalues(1,'tom','男',4)

insertintorecordsvalues(1,'tom','男',5)

--全选表中数据

select*fromrecords

--全选num列数据

selectnumas'数据'fromrecords

--释放游标

deallocateselect_num

--为‘selectnumfromrecords’建立游标

declareselect_numscrollcursorforselectnumas'shuju'fromrecords

--打开游标

openselect_num

--获得第一条数据

fetchnextfromselect_numinto@num_data

set@num_all=convert(varchar,@num_data)+','

set@num_num=@num_num+1;

--如果获取成功,继续获得数据

while@@fetch_status=0

begin

fetchnextfromselect_numinto@num_data

set@num_num=@num_num+1;

set@num_all=@num_all+convert(varchar,@num_data)+','

end

--关闭游标

closeselect_num

print@num_num

--set@num_num=@num_num-1;

declare@iint

set@i=1

print@num_num

print@i

set@table_sql='createtablenumall(idint,namevarchar(50),sexvarchar(10)'

print@table_sql

while@num_num>=1

begin

set@table_sql=@table_sql+',num'+convert(varchar,@i)+'int'

set@num_num=@num_num-1;

set@i=@i+1

end

set@table_sql=@table_sql+')'

print@table_sql

ifexists(select*fromdbo.sysobjectswhereid=object_id(N'[dbo].[numall]')andOBJECTPROPERTY(id,N'IsUserTable')=1)

droptable[dbo].[numall]

exec(@table_sql)

declare@insert_sqlvarchar(2000)

set@insert_sql='insertintonumallvalues(1,'+'''tom'','+'''男'''

print@insert_sql

openselect_num

--获得第一条数据

fetchnextfromselect_numinto@num_data

set@insert_sql=@insert_sql+','+convert(varchar,@num_data)

--如果获取成功,继续获得数据

while@@fetch_status=0

begin

fetchnextfromselect_numinto@num_data

set@insert_sql=@insert_sql+','+convert(varchar,@num_data)

end

set@insert_sql=@insert_sql+')'

print@insert_sql

exec(@insert_sql)

--insertintonumallvalues(1,'tom','男',2,3,4,5,5)

select*fromnumall

试试吧,数据虽然有点出入,但已经说明问题了!!!