sql语句怎么把列变成行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql语句怎么把列变成行相关的知识,希望对你有一定的参考价值。

表的结构如下:

sql语句怎么写,会生成如下结果:

注意“品名”即要转为行的列,它的数据是会变化的,不是固定不变的;
求sql语句!!
具体在sqlserver2008数据库中的表结构如下:

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 a.name=rotatetable1.company and box_weight=\'box\' and hsname=\'废塑料\';
update rotatetable1 set 废塑料=weight from sum1as a where a.name=rotatetable1.company and box_weight=\'weight\' and hsname=\'废塑料\';
::: :::
update rotatetable1 set 其它=box from sum1as a where a.name=rotatetable1.company and box_weight=\'box\' and hsname=\'其它\';
update rotatetable1 set 其它=weight from sum1as a where a.name=rotatetable1.company and box_weight=\'weight\' and hsname=\'其它\';
::: :::
update rotatetable1 set 合计=废塑料+废五金+废钢铁+废纸+废有色+废纤维+其它;

(所有涉及表的行列转换均可按照这种方式实现。)追问

废塑料,废五金,废钢铁,废纸,废有色,废纤维,这些只是hsname其中的一些内容,它还有其他内容,该字段是可以添加的,而不是固定这几项,而且你不清楚是哪些内容的,要求是根据该字段的具体内容而转换

追答

没关系,只要是转换为横向,则横向的列名称就是有限个,而且适合设置为列名称。
有多少个就建多少个就行了。
如果不能得到这个名称表,可以使用以下SQL语句取出来:
select hsname from sum1 group by hsname
把需要的都建上,不需要的sum到其它中就行了。
纵横转换就是把纵向的有限名称值转为列名:这就是转置的本质。

追问

能不能直接把数据库的表转为所需的表,而不需新建表!!

追答

也能实现啊,那样SQL句子很长啦。需要用join语句,把多个结果都关连起来。
效果是一样地。

追问

具体怎么写,求解?

参考技术A

很简单的行转列,用unpivot,给你个例子

create table #temp (id int,name varchar(10),weight decimal(10,2),bos int,hsname varchar(10))
go
insert into #temp values(1,'有限公司',20.1,7,'废塑料')
go
select * from #temp
;
with tb as (
select name,cast(weight as varchar(10)) weight,cast(bos as varchar(10)) bos,hsname from #temp where id=1
)
select 项目,值 from tb unpivot (值 for 项目 in([name],[weight],bos,hsname))t
--------------------------------------
项目 值
name 有限公司
weight 20.10
bos 7
hsname 废塑料

你自己参考测试看看。如没有问题还请采纳。

追问

那个表已经在sqlser2008中存在了,表名是Sum1;

问题:
把hsname的具体内容作为行,然后根据公司名,把重量和箱子数这两列分别显示,并求和;

追答;with tb as (
select id,name,weight+bos zl,hsname from #temp
)
select name,废塑料 from tb pivot (max(zl) for hsname in ([废塑料]) )t

name         废塑料

有限公司    27.10

追问

我对列转行完全不懂,请写得具体一点。

表的结构在数据库中是这样的:

然后我在网上找了一下资料,写了一下

得到的结果如下:

还是不符合,究竟怎样写的?跪求

参考技术B 如果是oracle可以用case或者decode

SQL语句行转列

org_id policy_id channel PREM 10000 5675567 团险 40 10000 5675568 个险 100 21000 5675402 团险 50 43100 5675382 个险 60 21000 5675442 个险 34 43100 5675444 团险 56 要用SQL语句显示出这样的结果 org_id 团险保费(PREM) 个险保费(PREM) 10000 40 100 21000 50 34 43100 56 60

根据楼主的描述,特为楼主总结如下,在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 参考技术A 用pivot()函数

以上是关于sql语句怎么把列变成行的主要内容,如果未能解决你的问题,请参考以下文章

sql 行变成列

如何用sql语句将多行合并成一行

如何使用sql语句使一个列的值变成另一个字段的值

SQL语句小数变成百分数

SQL语句拆分表中内容,并变成两列

sql语句列转行