1. 死磕:sql行转列汇总(全网最全最详细)
阅读目录
PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现
PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P
注意:PIVOT、UNPIVOT是SQL Server 2005 的语法,使用需修改数据库兼容级别(在数据库属性->选项->兼容级别改为 90 )
SQL2008 中可以直接使用
完整语法:
View Code
UNPIVOT 用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现
姓名 课程 分数
---------- ---------- -----------
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
姓名 语文 数学 物理
---------- ----------- ----------- -----------
李四 74 84 94
张三 74 83 93
姓名 语文 数学 物理 总分 平均分
---------- ----------- ----------- ----------- -----------
李四 74 84 94 252 84.00
张三 74 83 93 250 83.33
姓名 语文 数学 物理
---------- ----------- ----------- -----------
张三 74 83 93
李四 74 84 94
姓名 课程 分数
---------- ---- -----------
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
最后给大家分享Spring系列的学习笔记和面试题,包含spring面试题、spring cloud面试题、spring boot面试题、spring教程笔记、spring boot教程笔记、最新阿里巴巴开发手册(63页PDF总结)、2022年Java面试手册。一共整理了1184页PDF文档。私信博主(777)领取,祝大家更上一层楼!!!
原文作者:王思明
原文出处:http://www.cnblogs.com/maanshancss/
2. sql语句列转行
我整理的行转列的问题:
--创建tb表
createtabletb(姓名varchar(10),课程varchar(10),分数int)
insertintotbvalues('张三','语文',74)
insertintotbvalues('张三','数学',83)
insertintotbvalues('张三','物理',93)
insertintotbvalues('李四','语文',74)
insertintotbvalues('李四','数学',84)
insertintotbvalues('李四','物理',94)
go
select*Fromtb
--SQLSERVER2000静态行转列
select姓名as姓名,
max(case课程when'语文'then分数elsenullend)语文,
max(case课程when'数学'then分数elsenullend)数学,
max(case课程when'物理'then分数elsenullend)物理
fromtb
groupby姓名
--SQLSERVER2000动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare@sqlvarchar(8000)
set@sql='select姓名'
select@sql=@sql+',max(case课程when'''+课程+'''then分数else0end)['+课程+']'
from(selectdistinct课程fromtb)asa
set@sql=@sql+'fromtbgroupby姓名'
exec(@sql)
--SQLSERVER2005静态SQL。
select*from(select*fromtb)apivot(max(分数)for课程in(语文,数学,物理))b
--SQLSERVER2005动态SQL。
declare@sqlvarchar(8000)
select@sql=isnull(@sql+'],[','')+课程fromtbgroupby课程
set@sql='['+@sql+']'
exec('select*from(select*fromtb)apivot(max(分数)for课程in('+@sql+'))b')
希望对你的学习有帮助。
3. 写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语法就不说了,网上一堆一堆的 ~
4. 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的行。
5. 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
试试吧,数据虽然有点出入,但已经说明问题了!!!
6. sql行列转换
--mssql:
withtmp(col)as
(select'1111'unionall
select'2222'unionall
select'3333'unionall
select'4444'),
tmp1(col,col_new,level)as
(selectcol,cast(SUBSTRING(col,1,1)asnvarchar(10)),1
fromtmp
unionall
selectcol,cast(SUBSTRING(col,level+1,1)asnvarchar(10)),level+1
fromtmp1
wherelevel<LEN(col))
select(selectcol_new+''
fromtmp1
wherelevel=t.level
orderbycol_new
forxmlpath(''))ascol
fromtmp1t
groupbylevel;
--oracle:
withtmp(col)as
(select1111*levelfromalconnectbylevel<=4)
selectlistagg(a)withingroup(orderbya)ascol
from(selectcol,substr(col,column_value,1)a,column_valueb
fromtmp,
table(cast(multiset(selectlevel
fromal
connectbylevel<=length(col))as
sys.odcinumberlist)))
groupbyb
7. sql 如何实现行列转换如图
selectfangabh,listagg(ifbsh,'/')withingroup(orderbyfangabhdesc)
fromtable
groupbyfangabh
如果是oracle的话,也可以wmsys.wm_concat,如下
selectfangabh,wmsys.wm_concat(ifbsh)ifbsh,count(ifbsh)asttfromtable
groupbyfangabh
orderbyttdesc
8. 怎样实现sql行转列
--试一试。。。
createtable#test
(
姓名nvarchar(10),
学号nvarchar(10),
题号nvarchar(10),
答案nvarchar(10)
)
go
insertinto#test
select'张三','001','1','A'unionall
select'张三','001','2','C'unionall
select'李四','002','1','B'unionall
select'李四','002','2','D'
select*from#test
dECLARE@sqlVARCHAR(max)
SET@sql=''
SELECT@sql=@sql+',['+题号+']'FROM#testGROUPBY题号
SET@sql=STUFF(@sql,1,1,'')
SET@sql='select*from#testpivot(max(答案)for题号in('+@sql+'))a'
PRINT@sql
exec(@sql)
9. SQL 行转列
我这里两种都给你介绍,行转列和列转行:
列转行——
录入经营范围时候会遇到列传行的问题解决方案如下:
在temp1 表有一下字段内容:
10. 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语句;
一行数据变成多行数据,考虑自连接。