① 在sql里,如何将横向数据改成纵向数据结构
您好,行列转换等经典SQL语句
参考资料:http://blog.csdn.net/kiki113/archive/2009/04/24/4105929.aspx
1.--行列转换
原表: 姓名 科目 成绩
张三 语文 80
张三 数学 90
张三 物理 85
李四 语文 85
李四 物理 82
李四 英语 90
李四 政治 70
王五 英语 90
转换后的表: 姓名 数学 物理 英语 语文 政治
李四 0 82 90 85 70
王五 0 0 90 0 0
张三 90 85 0 80 0
实例:
create table cj --创建表cj
(
ID Int IDENTITY (1,1) not null, --创建列ID,并且每次新增一条记录就会加1
Name Varchar(50),
Subject Varchar(50),
Result Int,
primary key (ID) --定义ID为表cj的主键
);
--Truncate table cj
--Select * from cj
Insert into cj
Select '张三','语文',80 union all
Select '张三','数学',90 union all
Select '张三','物理',85 union all
Select '李四','语文',85 union all
Select '李四','物理',82 union all
Select '李四','英语',90 union all
Select '李四','政治',70 union all
Select '王五','英语',90
--行列转换
Declare @sql varchar(8000)
Set @sql = 'Select Name as 姓名'
Select @sql = @sql + ',sum(case Subject when '''+Subject+''' then Result else 0 end) ['+Subject+']'
from (select distinct Subject from cj) as cj --把所有唯一的科目的名称都列举出来
Select @sql = @sql+' from cj group by name'
Exec (@sql)
2. 行列转换--合并
原表: 班级 学号
1 1
1 2
1 3
2 1
2 2
3 1
转换后的表: 班级 学号
1 1,2,3
2 1,2
3 1
实例:
Create table ClassNo --创建表ClassNo
(
ID Int IDENTITY(1,1) not null, --创建列ID,并且每次新增一条记录就会加1
Class Varchar(50), --班级列
Number Varchar(50), --学号列
Primary Key(ID) --定义ID为表ClassNo的主键
);
--Truncate Table ClassNo
--Select * from ClassNo
Insert Into ClassNo
Select 1,1 Union all
Select 1,2 Union all
Select 1,3 Union all
Select 2,1 Union all
Select 2,2 Union all
Select 3,1
创建一个合并的函数
--Drop Function KFReturn
Create Function KFReturn(@Class Varchar(50))
Returns Varchar(8000)
as
Begin
Declare @str Varchar(8000)
Set @str = ''
Select @str = @str + cast(Number as Varchar(50)) + ',' from ClassNo Where Class = @Class
Set @str = SubString(@str,1,len(@str)-1)
Return(@str)
End
调用自定义函数得到结果
Select Distinct Class,dbo.KFReturn(Class) From ClassNo
3:列转行
--Drop Table ColumnToRow
Create table ColumnToRow
(
ID Int IDENTITY(1,1) not null, --创建列ID,并且每次新增一条记录就会加1
a int,
b int,
c int,
d int,
e int,
f int,
g int,
h int,
Primary Key(ID) --定义ID为表ColumnToRow的主键
);
--Truncate Table ColumnToRow
--Select * from ColumnToRow
Insert Into ColumnToRow
Select 15,9,1,0,1,2,4,2 Union all
Select 22,34,44,5,6,7,8,7 Union all
Select 33,44,55,66,77,88,99,12
Declare @sql Varchar(8000)
Set @sql = ''
Select @sql = @sql + rtrim(name) + ' from ColumnToRow union all Select ' from SysColumns Where id = object_id('ColumnToRow')
Set @sql = SubString(@sql,1,len(@sql)-70)
--70的长度就是这个字符串'from ColumnToRow union all Select ID from ColumnToRow union all Select ',因为它会把ID这一列的值也算进去,所以要把它截掉
Exec ('Select ' + @sql + ' from ColumnToRow')
② SQL中的统计加横表转纵表
根本没涉及横纵。
select a.*,b.军人人数,c.武警人数 from
(select 所在位置,count(*) as 警察人数 from 表 where 职务='警察' group by 位置) as a left jion
(select 所在位置,count(*) as 军人人数 from 表 where 职务='军人' group by 位置) as b
on a.所在位置=b.所在位置 left jion
(select 所在位置,count(*) as 武警人数 from 表 where 职务='武警' group by 位置) as c on a.所在位置=c.所在位置
③ sql 横表变竖表 动态语句怎么写
1、首先 日期没有出现在Group里
2、其次,组成动态的【,isnull(sum(...))】没有去掉最前面的那个逗号
3、感觉这个语句肯定不会执行成功,最好你把表结构给出,并且给出示例结果来。
④ SQL 怎么把横向数据变成竖向数据
随缘写法···可能有更精简的,我这就赶着想赶着写的 你看看能看懂不,如果觉得对不懂可以联系我
select
nn.客户 客户,
nn.昵称 昵称,
nn.补单日期1 补单日期1,
nn.业务员1 业务员1,
nn.补单日期2 补单日期2,
nn.业务员2 业务员2,
nn.补单日期3 补单日期3,
nn.业务员3 业务员3,
nn.补单日期4 补单日期4,
nn.业务员4 业务员4,
nn.业务员1 首选业务员,
nn.业务员2||'-'||nn.业务员3||'-'||nn.业务员4 候选业务员
from (
select tt.a2 客户,tt.a3 昵称,wm_concat (case when tt.top=0 then tt.a0 else '' end) 补单日期1,
wm_concat (case when tt.top=0 then tt.a4 else ''end) 业务员1,
wm_concat (case when tt.top=1 then tt.a0 else ''end) 补单日期2,
wm_concat (case when tt.top=1 then tt.a4 else ''end) 业务员2,
wm_concat (case when tt.top=2 then tt.a0 else ''end) 补单日期3,
wm_concat (case when tt.top=2 then tt.a4 else ''end) 业务员3,
wm_concat (case when tt.top=3 then tt.a0 else''end) 补单日期4,
wm_concat (case when tt.top=3 then tt.a4 else ''end) 业务员4
from
(
select zz.* from
(
select a.*,(select count(1) from a a1 where a1.a2=a.a2 and a.a0<a1.a0) top from a ORDER BY A2,A0 DESC
) zz
where
zz.top<4
) tt group by tt.a2,tt.a3
) nn
⑤ sql developer查询出来的数据默认是横着显示,怎样将查询的数据竖着显示例如下图所示
你问的是 Oracle自己的 sql developer 吧
在查询结果的表格 的 窗口中,
右键 --> 单个记录视图
即可。
⑥ 表格横转竖怎么转换
具体操作如下:
1、选芦游定需要由横行变竖列的表格范围。
2、单击右键,选择“复制”。
3、选择需要新建竖列表格的位置,可选择在该excel的其他sheet中渣哗哪的位置或者其他excel中的位置。
4、单击鼠标右键,然后点击选择性粘贴后会弹出选项窗口。
5、左键单击勾选上“转置”,然后点击确定。
MicrosoftOfficeforMac:在1989年时在Mac平台上推出,这一版的Office中包含了Word4.0、Excel2.20和PowerPoint2.01。此版本比运作在Windows平台上的Office更早被推出。MicrosoftOffice1.5forMac:在1991年时推出,其中Excel升级为Excel3.0。是首套支持如码苹果电脑System7操作系统的Office。MicrosoftOffice2.9forMac:在1992年时推出,其中Excel4.0是首套支持新AppleScript的软件。