SQL中的统计加横表转纵表
根本没涉及横纵。
创新互联建站主要从事做网站、成都网站建设、网页设计、企业做网站、公司建网站等业务。立足成都服务张店,十多年网站建设经验,价格优惠、服务专业,欢迎来电咨询建站服务:18980820575
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.所在位置
mysql 纵表转横表,高手请支招
你这个需要后台处理一下才可以,直接转换比较麻烦,效率也不高。因为你需要计算出每天的开始时间和结束时间insert into newtable select employeeID,days,MAX(cardTime) as endtime,Min(cardTime) as starttime from
table group by employeeID,days; 大概就这意思,自己在调试调试吧
如何将横表转换成纵表
将要改的行"复制",点击鼠标右键,"选择性粘贴",在对话框中选择最下面的"转置",就可以实现你想要的结果
横纵表的相互转换!
--行列互转
/******************************************************************************************************************************************************
以学生成绩为例子,比较形象易懂
整理人:中国风(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 行受影响)
*/
横表转纵表
select sum((case when name='序号' then type end)) 序号,
sum((case when name='截止日期' then type end)) 截止日期,
sum((case when name='品种' then type end)) 品种,
sum((case when name='种植进度' then type end)) 种植进度,
sum((case when name='当期' then type end)) 当期,
sum((case when name='5年平均' then type end)) 5年平均
from 表 gup by 1;
mysql纵表转横表
分两次进行不同的查询就可以实现了
先查出组员信息,比如组员数量、文章总数、评论总数等
再查出组长信息
两个查询一合并就可以了
SQL角本如下:
select a.用户名 组长, b.组员数量, b.文章总数, b.评论总数
from (select 编号, 用户名 from table_name where 角色 = '组长') a, -- 找组长信息
(select 组长,
count(1) 组员数量,
sum(文章) 文章总数,
sum(评论) 评论总数
from table_name
where 组长 is not null
group by 组长) b -- 找组员信息
where a.编号 = b.组长
当前名称:mysql横表怎么转纵表,表格怎么横向转纵向
分享URL:http://lswzjz.com/article/dsehdgd.html