Ⅰ sql语句行转列
根据楼主的描述,特为楼主总结如下,在SqlServer里面行列转换的语法一般是: select 字段, sum(case when 要转换的行单元格的字段名='行字段内容' then 聚合的字段名 end ) as 自定义的列标题1 from 表的名字 group by 字段(注意,分组聚合就是根据这个字段来的,具体到楼主的问题,这里的字段就应该是org_id) 如果有多个列,之间用逗号隔开就可以了,最后一个参数和from之间不要用逗号。 具体到楼主的显示效果就可以这样写了。代码参考如下: Select org_id , sum(case when channel ='团险' then PREM end) As '团险保费' , sum(case when channel ='个险' then PREM end) As '个险保费 From 你的表名 Group By org_id
Ⅱ sql 行转列
最简答的方法:使用程序数组,例如你现在的代码是:
do while not rs.eof
response.write rs("....")
rs.movenext
end do
那么可以下面这样输出:
'先为每个字段定义数组
dim a(1)
dim b(1)
n=1
do while not rs.eof
a(n)=rs("a")
b(n)=rs("b")
'...有多少字段写多少行....
n=n+1
rs.movenext
end do
'下面再输出
response.write "<table>";
response.write "<tr><td>" & join("<td>",a)
response.write "<tr><td>" & join("<td>",b)
response.write "</table>";
你的ASP程序不可能显示多少条,一般每页显示20条左右,用数组在显示的转换是可行的。
Ⅲ 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
试试吧,数据虽然有点出入,但已经说明问题了!!!
Ⅳ sql语句类似行转列的问题
select文件编号,版本号,count(*)as记录条数
fromtablegroupby文件编号,版本号
是这样?
Ⅳ sql语句列转行
主要应用case语句来解决行转列的问题
行转列问题主要分为两类
1)简单的行转列问题:
示例表:
id
sid
course
result
1
2005001
语文
80.0
2
2005001
数学
90.0
3
2005001
英语
80.0
4
2005002
语文
56.0
5
2005002
数学
69.0
6
2005002
英语
89.0
执行
select
sid,语文=isnull(sum(case
course
when
'语文'
then
result
end),0),
数学=isnull(sum(case
course
when
'数学'
then
result
end),0),
英语=isnull(sum(case
course
when
'英语'
then
result
end),0)
from
result
group
by
sid
order
by
sid
得出结果
sid
语文
数学
英语
2005001
80.0
90.0
80.0
2005002
56.0
69.0
89.0
Ⅵ SqlServer数据库怎么实现行转列的sql语句
PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现
PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P
注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为 90 )
SQL2008 中可以直接使用
完整语法:
table_source
PIVOT(
聚合函数(value_column)
FOR pivot_column
IN(<column_list>)
)
View Code
UNPIVOT 用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现
完整语法:
table_source
UNPIVOT(
value_column
FOR pivot_column
IN(<column_list>)
)
Ⅶ SQL 行转列问题
行转列不应该使用sql来解决,可使用报表工具中的交叉表来实现
数据库基本运算就是集合运算,解决行转列不合适。
求采纳为满意回答。
Ⅷ sql语句列转行的问题
sqlserver2005及以上版本
CREATETABLEtest(idINT,[USER_ID]VARCHAR(10),door_idVARCHAR(50))
INSERTINTOdbo.test
(id,USER_ID,door_id)
SELECT1,'U100174','0000000015;0000000018;;'
UNIONALL
SELECT2,'U120225','0000000023;'SELECTA.ID,USER_ID,B.door_id
FROM(
SELECTid,USER_ID,door_id=CONVERT(xml,'<root><v>'+REPLACE(door_id,';','</v><v>')+'</v></root>')FROMtest
)A
OUTERAPPLY(
SELECTdoor_id=N.v.value('.','varchar(100)')FROMA.door_id.nodes('/root/v')N(v)
)B
WHEREISNULL(b.door_id,'')<>''
结果:
1 U100174 0000000015
1 U100174 0000000018
2 U120225 0000000023
Ⅸ 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语句,怎么将下面的表行转列,按列绑定,在线等!求红领巾帮忙
--行列转换(列长度不大于255,行过多则无法进行转换与数据库机制相关)
create procere TransTable @TableName nvarchar(255)
as
declare @FlagNo int,@Rows int
create table ##tmp_table(ColName nvarchar(255))
declare @sql nvarchar(4000)
--以原来的列标题作为第一列数据
set @sql='insert into ##tmp_table
select name from syscolumns where id=(select max(id) from sysobjects where xtype=''u'' and name='''+@TableName+''')
'
exec sp_executesql @sql
set @FlagNo=1
set @sql='select @Count=COUNT(*) from '+@TableName
exec sp_executesql @sql,N'@Count int OutPut',@Rows Output
if ISNULL(@Rows,0)=0
begin
select * from ##tmp_table
drop table ##tmp_table
return
end
--列建立
set @FlagNo=1
while @FlagNo<=@Rows
begin
set @sql='
alter table ##tmp_table
add FColumn'+CAST(@FlagNo as nvarchar(10))+' nvarchar(255)'
exec sp_executesql @sql
set @FlagNo=@FlagNo+1
end
declare @ColName nvarchar(255)
declare cur cursor for
select ColName from ##tmp_table
open cur
fetch next from cur into @ColName
while @@FETCH_STATUS=0
begin
set @sql='
declare @FValue nvarchar(255)
declare @curFlag int
declare cur_value cursor for
select cast('+@ColName+' as nvarchar(255)) from '+@TableName+'
set @curFlag=1
open cur_value
fetch next from cur_value into @FValue
while @@FETCH_STATUS=0
begin
if @curFlag<='+CAST(@Rows as nvarchar(20))+'
exec TransTableUpdateValue '''+@ColName+''',@curFlag,@FValue
fetch next from cur_value into @FValue
set @curFlag=@curFlag+1
end
close cur_value
DEALLOCATE cur_value
'
--select @sql
exec sp_executesql @sql
fetch next from cur into @ColName
end
close cur
DEALLOCATE cur
select * from ##tmp_table
drop table ##tmp_table
--更新单元数据
create procere TransTableUpdateValue @ColName nvarchar(255),@FlagInt int,@value nvarchar(255)
as
declare @Sql nvarchar(1000)
set @Sql='
update ##tmp_table set FColumn'+CAST(@FlagInt as nvarchar(10))
+'='''+isnull(@value,'')+''' where ColName='''+@ColName+''''
--select @sql
exec sp_executesql @sql
execTransTable'你的表'--(行不能太多,因为每个列定义长度255,过长无法使用,sql,你知道的)