⑴ sql server 纵表转横表
如果单纯是你如上数据的话这样:
创建表:
createtablet
(idint,
orderidint,
prfnoint,
prfidvarchar(10));
insertintotvalues(16385,171202,1,'FB065_1');
insertintotvalues(16385,171202,2,'FB065_06');
insertintotvalues(16385,171202,3,'FB065_06');
insertintotvalues(16385,171202,4,'FB065_06');
insertintotvalues(16386,171202,1,'FB065_1');
insertintotvalues(16386,171202,2,'FB065_06');
insertintotvalues(16386,171202,3,'FB065_06');
insertintotvalues(16386,171202,4,'FB065_06');
执行:
selectid,orderid,
max(casewhenprfno=1thenprfidend)prfid1,
max(casewhenprfno=2thenprfidend)prfid2,
max(casewhenprfno=3thenprfidend)prfid3,
max(casewhenprfno=4thenprfidend)prfid4
fromtgroupbyid,orderid
结果:
如果需求复杂的话,就要改别的方法了。
⑵ 数据库纵表变横表会不会影响性能
横表就是普通的建表方式,如一个表结构为:主键、字段1、字段2、字段3。。。 如果变成纵表后,则表结构为: 主键、字段代码、字段值。而字段代码则为字段1、字段2、字段3。 具体为电信行业的例子。以用户帐单表为例一般出账时用户有很多费用客户,其数据一般存储为:时间,客户ID,费用科目,费用。这种存储结构一般称为纵表,其特点是行数多,字段少。纵表在使用时由于行数多,统计用户数或对用户进行分档时还需要进行GROUP BY 操作,性能低,且操作不便,为提高性能,通常根据需要将纵表进行汇总,形成横表,比如:时间、客户ID,基本通话费、漫游通话费,国内长途费、国际长途费....。通常形成一个客户一行的表,这种表统计用户数或做分档统计时比较方便。另外,数据挖掘时用到的宽表一般也要求是横表结构。纵表对从数据库到内存的映射效率是有影响的,但细一点说也要一分为二:纵表的初始映射要慢一些;纵表的变更的映射可能要快一些,如果只是改变了单个字段时,毕竟横表字段比纵表要多很多
⑶ SQL 如何查询时 竖着的数据 横着显示
你这个是将纵表转换为横表,例如如下数据:
'wangming', 'shuxue', 100
'wangming', 'yuwen', 90
'wangming', 'yingyu', 140
可以使用如下语句处理:
select a.v_name,a.v_score shuxue,b.v_score yuwen,c.v_score yingyu from temp_1 a,temp_1 b,temp_1 c
where a.v_name=b.v_name
and a.v_name=c.v_name
and a.v_name='wangming'
and a.v_course='shuxue'
and b.v_course='yuwen'
and c.v_course='yingyu';
⑷ mysql纵表转横表
分两次进行不同的查询就可以实现了
先查出组员信息,比如组员数量、文章总数、评论总数等
再查出组长信息
两个查询一合并就可以了
SQL角本如下:
selecta.用户名组长,b.组员数量,b.文章总数,b.评论总数
from(select编号,用户名fromtable_namewhere角色='组长')a,--找组长信息
(select组长,
count(1)组员数量,
sum(文章)文章总数,
sum(评论)评论总数
fromtable_name
where组长isnotnull
groupby组长)b--找组员信息
wherea.编号=b.组长
⑸ mysql 纵表转横表,高手请支招
你这个需要后台处理一下才可以,直接转换比较麻烦,效率也不高。因为你需要计算出每天的开始时间和结束时间insert into newtable select employeeID,days,MAX(cardTime) as endtime,Min(cardTime) as starttime from
table group by employeeID,days; 大概就这意思,自己在调试调试吧
⑹ 急求:SQL语句进行行列转换!!!
你的这种变化貌似是毫无意义的,或许
你想要的变换时下面的这种情况吧。
******原来的纵表tb*****
学号
科目
成绩
1001
语文
90
1001
数学
80
1001
英语
70
1002
语文
95
1002
数学
85
1002
英语
75
*****目标的横表*****
学号
语文
数学
英语
总分
1001
90
80
70
240
1002
95
85
75
255
sql语句:
select
学号
as
'学号',
sum(case
科目
when
'语文'
then
成绩
else
0
end)
as
'语文',
sum(case
科目
when
'数学'
then
成绩
else
0
end)
as
'数学',
sum(case
科目
when
'英语'
then
成绩
else
0
end)
as
'英语',
sum(case
when
科目!=''
then
成绩
end)
as
'总分'
from
tb
group
by
学号
⑺ SQL sever中将横表转纵表时的这段代码是什么意思,可以详细解释一下吗
查询每个 name 中 语文 的最大 result 值,如果 语文 的 result 没有值,则返回0;
其他数学、物理原理一样;
⑻ 数据库sql 问题
select年份,sum(casewhen季度=1then产量end),sum(casewhen季度=2then产量end),sum(casewhen季度=3then产量end),sum(casewhen季度=4then产量end)from表名groupby年份orderby年份
⑼ 横纵表的相互转换!
--行列互转
/******************************************************************************************************************************************************
以学生成绩为例子,比较形象易懂
整理人:中国风(Roy)
日期:2008.06.06
******************************************************************************************************************************************************/
--1、行互列
--> --> (Roy)生成测试数据
if not object_id('Class') is null
drop table Class
Go
Create table Class([student] nvarchar(2),[subject] nvarchar(2),[grade] int)
Insert Class
select N'张三',N'语文',78 union all
select N'张三',N'数学',87 union all
select N'张三',N'英语',82 union all
select N'张三',N'物理',90 union all
select N'李四',N'语文',65 union all
select N'李四',N'数学',77 union all
select N'李四',N'英语',65 union all
select N'李四',N'物理',85
Go
--2000方法:
动态:
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([subject])+'=max(case when [subject]='+quotename([subject],'''')+' then [grade] else 0 end)'
from Class group by[subject]
exec('select [student]'+@s+' from Class group by [student]')
生成静态:
select
[student],
[数学]=max(case when [subject]='数学' then [grade] else 0 end),
[物理]=max(case when [subject]='物理' then [grade] else 0 end),
[英语]=max(case when [subject]='英语' then [grade] else 0 end),
[语文]=max(case when [subject]='语文' then [grade] else 0 end)
from
Class
group by [student]
GO
动态:
declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename([subject]) from Class group by[subject]
exec('select * from Class pivot (max([grade]) for [subject] in('+@s+'))b')
生成静态:
select *
from
Class
pivot
(max([grade]) for [subject] in([数学],[物理],[英语],[语文]))b
生成格式:
/*
student 数学 物理 英语 语文
------- ----------- ----------- ----------- -----------
李四 77 85 65 65
张三 87 90 82 78
(2 行受影响)
*/
------------------------------------------------------------------------------------------
go
--加上总成绩(学科平均分)
--2000方法:
动态:
declare @s nvarchar(4000)
set @s=''
Select @s=@s+','+quotename([subject])+'=max(case when [subject]='+quotename([subject],'''')+' then [grade] else 0 end)'
from Class group by[subject]
exec('select [student]'+@s+',[总成绩]=sum([grade]) from Class group by [student]')--加多一列(学科平均分用avg([grade]))
生成动态:
select
[student],
[数学]=max(case when [subject]='数学' then [grade] else 0 end),
[物理]=max(case when [subject]='物理' then [grade] else 0 end),
[英语]=max(case when [subject]='英语' then [grade] else 0 end),
[语文]=max(case when [subject]='语文' then [grade] else 0 end),
[总成绩]=sum([grade]) --加多一列(学科平均分用avg([grade]))
from
Class
group by [student]
go
--2005方法:
动态:
declare @s nvarchar(4000)
Select @s=isnull(@s+',','')+quotename([subject]) from Class group by[subject] --isnull(@s+',','') 去掉字符串@s中第一个逗号
exec('select [student],'+@s+',[总成绩] from (select *,[总成绩]=sum([grade])over(partition by [student]) from Class) a
pivot (max([grade]) for [subject] in('+@s+'))b ')
生成静态:
select
[student],[数学],[物理],[英语],[语文],[总成绩]
from
(select *,[总成绩]=sum([grade])over(partition by [student]) from Class) a --平均分时用avg([grade])
pivot
(max([grade]) for [subject] in([数学],[物理],[英语],[语文]))b
生成格式:
/*
student 数学 物理 英语 语文 总成绩
------- ----------- ----------- ----------- ----------- -----------
李四 77 85 65 65 292
张三 87 90 82 78 337
(2 行受影响)
*/
go
--2、列转行
--> --> (Roy)生成测试数据
if not object_id('Class') is null
drop table Class
Go
Create table Class([student] nvarchar(2),[数学] int,[物理] int,[英语] int,[语文] int)
Insert Class
select N'李四',77,85,65,65 union all
select N'张三',87,90,82,78
Go
--2000:
动态:
declare @s nvarchar(4000)
select @s=isnull(@s+' union all ','')+'select [student],[subject]='+quotename(Name,'''')--isnull(@s+' union all ','') 去掉字符串@s中第一个union all
+',[grade]='+quotename(Name)+' from Class'
from syscolumns where ID=object_id('Class') and Name not in('student')--排除不转换的列
order by Colid
exec('select * from ('+@s+')t order by [student],[subject]')--增加一个排序
生成静态:
select *
from (select [student],[subject]='数学',[grade]=[数学] from Class union all
select [student],[subject]='物理',[grade]=[物理] from Class union all
select [student],[subject]='英语',[grade]=[英语] from Class union all
select [student],[subject]='语文',[grade]=[语文] from Class)t
order by [student],[subject]
go
--2005:
动态:
declare @s nvarchar(4000)
select @s=isnull(@s+',','')+quotename(Name)
from syscolumns where ID=object_id('Class') and Name not in('student')
order by Colid
exec('select student,[subject],[grade] from Class unpivot ([grade] for [subject] in('+@s+'))b')
go
select
student,[subject],[grade]
from
Class
unpivot
([grade] for [subject] in([数学],[物理],[英语],[语文]))b
生成格式:
/*
student subject grade
------- ------- -----------
李四 数学 77
李四 物理 85
李四 英语 65
李四 语文 65
张三 数学 87
张三 物理 90
张三 英语 82
张三 语文 78
(8 行受影响)
*/
⑽ 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.所在位置