如何用SQL把下面两个表完全倒过来,行变列,列变行完全转置!

如何用SQL把下面两个表完全倒过来,行变列,列变行完全转置!,第1张

静态脚本:

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语句怎么把列变成行等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9353633.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存