静态脚本:
select '收入' as 项目
, case when 项目='一厂本月' then 收入 else null end as 一厂本月
, case when 项目='一厂本年' then 收入 else null end as 一厂本年
, case when 项目='二厂本月' then 收入 else null end as 二厂本月
, case when 项目='二厂本年' then 收入 else null end as 二厂本年
, case when 项目='三厂本月' then 收入 else null end as 三厂本月
, case when 项目='三厂本年' then 收入 else null end as 三厂本年
from 表名
union all
select '成本' as 项目
, case when 项目='一厂本月' then 成本 else null end as 一厂本月
, case when 项目='一厂本年' then 成本 else null end as 一厂本年
, case when 项目='二厂本月' then 成本 else null end as 二厂本月
, case when 项目='二厂本年' then 成本 else null end as 二厂本年
, case when 项目='三厂本月' then 成本 else null end as 三厂本月
, case when 项目='三厂本年' then 成本 else null end as 三厂本年
from 表名
union all
select '其他费用' as 项目
, case when 项目='一厂本月' then 其他费用 else null end as 一厂本月
, case when 项目='一厂本年' then 其他费用 else null end as 一厂本年
, case when 项目='二厂本月' then 其他费用 else null end as 二厂本月
, case when 项目='二厂本年' then 其他费用 else null end as 二厂本年
, case when 项目='三厂本月' then 其他费用 else null end as 三厂本月
, case when 项目='三厂本年' then 其他费用 else null end as 三厂本年
from 表名
union all
select '毛利' as 项目
, case when 项目='一厂本月' then 毛利 else null end as 一厂本月
, case when 项目='一厂本年' then 毛利 else null end as 一厂本年
, case when 项目='二厂本月' then 毛利 else null end as 二厂本月
, case when 项目='二厂本年' then 毛利 else null end as 二厂本年
, case when 项目='三厂本月' then 毛利 else null end as 三厂本月
, case when 项目='三厂本年' then 毛利 else null end as 三厂本年
from 表名
改动态脚本(只改项目,即改原表行不定,列数目固定):
declare @sql nvarchar(max)
set @sql=''
set @sql=@sql+'
select ''收入'' as 项目
'
select @sql=@sql+', case when 项目='''+项目+''' then 收入 else null end as '+项目
from 表名
set @sql=@sql+'
from 表名
'
set @sql=@sql+'union all
select ''成本'' as 项目
'
select @sql=@sql+', case when 项目='''+项目+''' then 成本 else null end as '+项目
from 表名
set @sql=@sql+'
from 表名
'
set @sql=@sql+'union all
select ''其他费用'' as 项目
'
select @sql=@sql+', case when 项目='''+项目+''' then 其他费用 else null end as '+项目
from 表名
set @sql=@sql+'
from 表名
'
set @sql=@sql+'union all
select ''毛利'' as 项目
'
select @sql=@sql+', case when 项目='''+项目+''' then 毛利 else null end as '+项目
from 表名
set @sql=@sql+'
from 表名
'
exec sp_executesql @sql
改动态脚本(改原表行和列数目不固定,两层动态脚本,能实现但基本难读):
declare @sql nvarchar(max)
set @sql='declare @sql_in nvarchar(max)
set @sql_in='' '' '
set @sql=@sql+'select @sql_in=@sql_in+''union all
select ''''''+name+'''''' as 项目
'
select @sql=@sql+', case when 项目='''''+项目+''''' then ''+name+'' else null end as '+项目
from 表名
set @sql=@sql+'
from 表名
''
from syscolumns where id=(select id from sysobjects where name=''表名'')
order by colorder
set @sql_in=stuff(@sql_in,1,10,'''')
exec sp_executesql @sql_in
'
exec sp_executesql @sql
Head模板里:<table><tr>
模板:
<td>
<table>
<tr><td><%# Eval("姓名")%></td></tr>
<tr><td>><%# Eval("课程")%></td></tr>
<tr><td>><%# Eval("分数")%></td></tr>
</table>
</td>
foot模板:
</tr></table>
create table rotatetable1 (序号 int,company char(66),box_weight char(12),废塑料numeric(10,2)),废五金 numeric(10,2)),废钢铁 numeric(10,2)),废纸 numeric(10,2)),废有色 numeric(10,2)),废纤维 numeric(10,2)),其它 numeric(10,2)),合计 numeric(10,2)));
insert into rotatetable1(company,box_weight) select name ,'weight' from sum1 group by name;
insert into rotatetable1(company,box_weight) select name ,'box' from sum1 group by name;
update rotatetable1 set 废塑料=box from sum1as a where aname=rotatetable1company and box_weight='box' and hsname='废塑料';
update rotatetable1 set 废塑料=weight from sum1as a where aname=rotatetable1company and box_weight='weight' and hsname='废塑料';
::: :::
update rotatetable1 set 其它=box from sum1as a where aname=rotatetable1company and box_weight='box' and hsname='其它';
update rotatetable1 set 其它=weight from sum1as a where aname=rotatetable1company and box_weight='weight' and hsname='其它';
::: :::
update rotatetable1 set 合计=废塑料+废五金+废钢铁+废纸+废有色+废纤维+其它;
(所有涉及表的行列转换均可按照这种方式实现。)
如果你的列是固定的,无论多少行,都可以通过典型的case when语句来处理,由于你图1不太能看清,我们假设你想显示列名为typeid,值为1,3,4的分列统计信息,则SQL语句如下:
select orgid,sum((case when typeid=1 then 1 else 0 end))as typeid1,
sum((case when typeid=3 then 1 else 0 end))as typeid3,
sum((case when typeid=4 then 1 else 0 end))as typeid4
from Table001 where 1=1
group by orgid
如能提供清晰的图1,我再写给你完全可执行的SQL
比如:有张学生成绩表(tb)如下:
Name Subject Result
张三 语文74
张三 数学83
张三 物理93
李四 语文74
李四 数学84
李四 物理94
代码如下:
create table tb
(
Name varchar(10) ,
Subject varchar(10) ,
Result int
)
insert into tb(Name , Subject , Result) values(张三 , 语文 , 74)
insert into tb(Name , Subject , Result) values(张三 , 数学 , 83)
insert into tb(Name , Subject , Result) values(张三 , 物理 , 93)
insert into tb(Name , Subject , Result) values(李四 , 语文 , 74)
insert into tb(Name , Subject , Result) values(李四 , 数学 , 84)
insert into tb(Name , Subject , Result) values(李四 , 物理 , 94)
go
--将分组统计存入临时表
select substring([DATE],5,2),sum([IN]) into #tmp from 表 where substring([DATE],1,4)='1900' group by substring([DATE],5,2)
--生成行列转换的SQL语句
declare @sql varchar(1024)
set @sql = 'select '
select @sql = @sql + 'sum(case [DATE] when '''+[DATE]+''' then [IN] end) as '+[DATE] from (select distinct [DATE] from #tmp) as a
set @sql = @sql+' from #tmp'
--执行语句并清理临时表
exec(@sql)
drop table #tmp
以上就是关于如何用SQL把下面两个表完全倒过来,行变列,列变行完全转置!全部的内容,包括:如何用SQL把下面两个表完全倒过来,行变列,列变行完全转置!、C#DataList和GridView绑定怎样把sql2000数据库里表信息 列转变成行显示、sql语句怎么把列变成行等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)