㈠ 请教一个关于sql行列转置的问题。
declare @maxcount int;
declare @i int;
declare @sql nvarchar(max);
select @maxcount=max(C) from (select 采购商,count(*) C from table1 group by 采购商) a
print @maxcount
set @i=1;
set @sql='select distinct 采购商,(select max(商品) from table1 b where b.采购商=a.采购商) 商品1'
while @i<@maxcount
begin
set @sql=@sql+', (select max(商品) from table1 b where b.采购商=a.采购商 and 商品 not in (select top '+ cast(@i as nvarchar(4))+' 商品 from table1 c where b.采购商=c.采购商 order by 商品 desc)) 商品' + cast(@i+1 as nvarchar(4))
set @i=@i+1
end
set @sql=@sql+' from table1 a'
exec(@sql)
㈡ sql 如何实现行列转换如图
selectfangabh,listagg(ifbsh,'/')withingroup(orderbyfangabhdesc)
fromtable
groupbyfangabh
如果是oracle的话,也可以wmsys.wm_concat,如下
selectfangabh,wmsys.wm_concat(ifbsh)ifbsh,count(ifbsh)asttfromtable
groupbyfangabh
orderbyttdesc
㈢ sql怎样将行的值变为列,,,,
方法/步骤
首先我们建立一张表,名为RToC,各个字段的设计如下图,分别是name,course,score,表示姓名,成绩与分数,如图所示。
通过以上几个步骤,我们就可以轻松的实现行列转换了。同样,我们如果要把列转换成行, 应该怎么做呢?同样我们可以采用unpivot函数轻松实现。
㈣ SQL行列转置
declare @sql varchar(8000)
declare @date varchar(20)
declare @bmbh varchar(20)
declare @ckbh varchar(20)
set @date='20110101'
set @bmbh='500103'
set @ckbh='0601'set @sql = 'select max(lsbmzd_bmmc) as bmmc,kcrkd2_wlbh as wlbh,max(lswlzd_wlmc) as wlmc,max(lswlzd_ggxh) as ggxh ,sum(kcrkd2_sssl) as sum'
select @sql = @sql + ', max(case kcrkd1_kcywrq when ''' + kcrkd1_kcywrq + ''' then kcrkd2_sssl else 0 end) [' + kcrkd1_kcywrq + ']'
from (select distinct kcrkd1_kcywrq from kcrkd1
where kcrkd1_kcywrq>= substring(convert(varchar(100),dateadd(mm,-1,Convert(DateTime,@date)),112),1,6)+'26'
and kcrkd1_kcywrq<=substring(@date,1,6)+'25') as a
set @sql = @sql + ' from kcrkd1,kcrkd2,lswlzd,lsbmzd
where kcrkd1_lsbh=kcrkd2_lsbh and kcrkd1_pjlx=''j'' and kcrkd1_ckbh='''+@ckbh+''' and kcrkd1_bmbh=lsbmzd_bmbh and kcrkd2_wlbh=lswlzd_wlbh and kcrkd1_bmbh='''+@bmbh+'''
group by kcrkd2_wlbh'
exec(@sql)
㈤ SQL行转列,列转行
行列转换在做报表分析时还是经常会遇到的,今天就说一下如何实现行列转换吧。
行列转换就是如下图所示两种展示形式的互相转换
假如我们有下表:
通过上面 SQL 语句即可得到下面的结果
PIVOT 后跟一个聚合函数来拿到结果,FOR 后面跟的科目是我们要转换的列,这样的话科目中的语文、数学、英语就就被转换为列。IN 后面跟的就是具体的科目值。
当然我们也可以用 CASE WHEN 得到同样的结果,就是写起来麻烦一点。
使用 CASE WHEN 可以得到和 PIVOT 同样的结果,没有 PIVOT 简单直观。
假设我们有下表 student1
通过 UNPIVOT 即可得到如下结果:
我们也可以使用下面方法得到同样结果
㈥ 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 行列转换
前段时间有人问了一个问题,就是SQL的行列转换,当时有点懵没答上来,后来细细想一想,其实最近的一个项目就已经用到了。
基础数据如下:
要求根据当年的月份去统计出每一个ID的汇总金额。就是把行中的月切换到列中。
最后效果如下:
参考资料: https://technet.microsoft.com/zh-cn/library/ms177410(v=sql.105).aspx#%E5%A4%8D%E6%9D%82%20PIVOT%20%E7%A4%BA%E4%BE%8B
带批注的 PIVOT 语法。
如果聚合函数与 PIVOT 一起使用,则计算聚合时将不考虑出现在值列中的任何空值。
新建两张表
查询结果
--UNPIVOT 函数
--单纯用SQL 处理 ,原理很简单,就是对每个需要置换的列单独处理出来
最终效果:
--用上面的结果新建表
--PIVOT
-- SQL直接处理,先用CASE 语句将每行处理出来,然后在用聚合去处理合并相同ID的行。
㈧ 写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行列转置语句
declare
@sql
varchar(2000)
set
@sql=''
select
@sql=@sql+',max(case
B
when
'+cast(B
as
varchar(10))+'
then
c
end)
['+cast(B
as
varchar(10))+']'
from
(Select
distinct
B
from
TB)
x
set
@sql='select
A'+@sql+'
from
(select
A,B,count(distinct
C)
c
from
tb
group
by
A,B)
v
group
by
a'
exec(@sql)
㈩ 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
试试吧,数据虽然有点出入,但已经说明问题了!!!