如有下列表
班级 学号 姓名 类别 分值 时间
一班 01 张三 迟到 -0.3 2012.05.01
一班 01 张三 迟到 -0.3 2012.05.02
一班 01 张三 迟到 -0.3 2012.05.03
二班 02 李四 旷课 -0.5 2012.05.04
三班 03 王五 旷课 -0.5 2012.05.04
三班 04 赵六 早退 -0.4 2012.05.05
三班 04 赵六 迟到 -0.4 2012.05.05我要得到时间从2012.05.02 到 2012.05.05 的统计:(这里的where条件不至时间一项,有多条,如班级等)
班级 学号 姓名 迟到 旷课 早退 合计
一班 01 张三 -0.6 0 0 -0.6
二班 02 李四 0 -0.5 0 -0.5
三班 03 王五 0 -0.5 0 -0.5
三班 04 赵六 -0.4 0 -0.4 -0.8这样的sql 怎样写,如果用pivot关键字又怎样写?
班级 学号 姓名 类别 分值 时间
一班 01 张三 迟到 -0.3 2012.05.01
一班 01 张三 迟到 -0.3 2012.05.02
一班 01 张三 迟到 -0.3 2012.05.03
二班 02 李四 旷课 -0.5 2012.05.04
三班 03 王五 旷课 -0.5 2012.05.04
三班 04 赵六 早退 -0.4 2012.05.05
三班 04 赵六 迟到 -0.4 2012.05.05我要得到时间从2012.05.02 到 2012.05.05 的统计:(这里的where条件不至时间一项,有多条,如班级等)
班级 学号 姓名 迟到 旷课 早退 合计
一班 01 张三 -0.6 0 0 -0.6
二班 02 李四 0 -0.5 0 -0.5
三班 03 王五 0 -0.5 0 -0.5
三班 04 赵六 -0.4 0 -0.4 -0.8这样的sql 怎样写,如果用pivot关键字又怎样写?
解决方案 »
- 求SQL Server 2000 SP4 64位组件(SQL2000-KB884525-SP4-ia64.EXE)
- 请问 表#的存在性 如何判断
- 我的SP4补丁打不上,为什么啊?
- 请问谁可以对下面的语句进行解释一下
- 急!!!sql server 2005中的执行字符数据转换选项在那里
- composite clustered?
- 数据库设计
- ***英雄救美!帮帮小女子,我愿送上"QQ" 一个!!!
- 我想存储’这个字符怎么写SQL语句?
- sql server 2008 Management Stuido 不能连接到sql server2012
- sql server 对象获取ID问题
- 求优化千万级数据库语句
go
create table [tb]([班级] varchar(4),[学号] varchar(2),[姓名] varchar(4),[类别] varchar(4),[分值] numeric(2,1),[时间] datetime)
insert [tb]
select '一班','01','张三','迟到',-0.3,'2012.05.01' union all
select '一班','01','张三','迟到',-0.3,'2012.05.02' union all
select '一班','01','张三','迟到',-0.3,'2012.05.03' union all
select '二班','02','李四','旷课',-0.5,'2012.05.04' union all
select '三班','03','王五','旷课',-0.5,'2012.05.04' union all
select '三班','04','赵六','早退',-0.4,'2012.05.05' union all
select '三班','04','赵六','迟到',-0.4,'2012.05.05'
godeclare @sql varchar(8000)
select @sql=isnull(@sql+',','')
+'sum(case when 类别='''+类别+''' then 分值 else 0 end) as ['+类别+']'
from
(select distinct 类别 from tb where 时间 between '2012-05-02' and '2012-05-05') texec ('select 班级,学号,姓名,'
+@sql
+',sum(分值) as 合计 from tb where 时间 between ''2012-05-02'' and ''2012-05-05'' group by 班级,学号,姓名'
)
/**
班级 学号 姓名 迟到 旷课 早退 合计
---- ---- ---- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
二班 02 李四 0.0 -0.5 0.0 -0.5
三班 03 王五 0.0 -0.5 0.0 -0.5
三班 04 赵六 -0.4 0.0 -0.4 -0.8
一班 01 张三 -0.6 0.0 0.0 -0.6(4 行受影响)
**/
其他条件一样加到后面即可
迟到=sum(case when 类别='迟到' then 分值 else 0 end),
旷课=sum(case when 类别='旷课' then 分值 else 0 end),
早退=sum(case when 类别='早退' then 分值 else 0 end),
from tb where 时间 between '2012-05-02' and '2012-05-05'
group by 班级,学号,姓名
--动态语句
if(object_id('a')is not null) drop table a
go
create table a
(
grade varchar(50),
studentID varchar(2),
[name] varchar(50),
category varchar(50),
score decimal(18,2),
date datetime
)
goinsert into a
select '一班','01','张三','迟到',-0.3,'2012.05.01' union all
select '一班','01','张三','迟到',-0.3,'2012.05.02' union all
select '一班','01','张三','迟到',-0.3,'2012.05.03' union all
select '二班','02','李四','旷课',-0.5,'2012.05.04' union all
select '三班','03','王五','旷课',-0.5,'2012.05.04' union all
select '三班','04','赵六','早退',-0.4,'2012.05.05' union all
select '三班','04','赵六','迟到',-0.4,'2012.05.05'
go
select * from adeclare @sql varchar(7500)
set @sql = ''
select @sql = @sql+', sum(case when [category]='+quotename([category],'''')+' then '+quotename('score')+' else 0 end) as '+quotename([category],'''') from a group by category
exec ('select *,[迟到]+旷课+[早退] as ''合计'' from (select grade,studentID,name'+ @sql+' from a group by grade,studentID,name)as a')/*
grade studentID name 迟到 旷课 早退 合计
-------------------------------------------------- --------- -------------------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
二班 02 李四 0.00 -0.50 0.00 -0.50
三班 03 王五 0.00 -0.50 0.00 -0.50
三班 04 赵六 -0.40 0.00 -0.40 -0.80
一班 01 张三 -0.90 0.00 0.00 -0.90(4 行受影响)
*/
3楼的朋友,如加上合计,应该是怎样写?
5楼的朋友,能写成哪种没有 @sql 的写法吗,就是直接是sql 查询字符串的哪种?
if(object_id('a')is not null) drop table a
go
create table a (
grade varchar(50),
studentID varchar(2),
[name] varchar(50),
category varchar(50),
score decimal(18,2),
date datetime )
go
insert into a
select '一班','01','张三','迟到',-0.3,'2012.05.01' union all
select '一班','01','张三','迟到',-0.3,'2012.05.02' union all
select '一班','01','张三','迟到',-0.3,'2012.05.03' union all
select '二班','02','李四','旷课',-0.5,'2012.05.04' union all
select '三班','03','王五','旷课',-0.5,'2012.05.04' union all
select '三班','04','赵六','早退',-0.4,'2012.05.05' union all
select '三班','04','赵六','迟到',-0.4,'2012.05.05'
go
select *,[迟到]+旷课+[早退] as '合计'
from (
select grade,studentID,name, sum(case when [category]='迟到' then [score] else 0 end) as '迟到'
, sum(case when [category]='旷课' then [score] else 0 end) as '旷课'
, sum(case when [category]='早退' then [score] else 0 end) as '早退'
from a
group by grade,studentID,name
)as a
/*
grade studentID name 迟到 旷课 早退 合计
-------------------------------------------------- --------- -------------------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
二班 02 李四 0.00 -0.50 0.00 -0.50
三班 03 王五 0.00 -0.50 0.00 -0.50
三班 04 赵六 -0.40 0.00 -0.40 -0.80
一班 01 张三 -0.90 0.00 0.00 -0.90(4 行受影响)
*/
MAX(case 类别 when '迟到' then 分值 else 0 end) 迟到,
MAX(case 类别 when '旷课' then 分值 else 0 end) 旷课,
MAX(case 类别 when '早退' then 分值 else 0 end) 早退,
SUM(分值)总分值 from #ta where 时间 between '2012-05-02' and '2012-05-05' group by 班级,学号,姓名
-----------------------------华丽的分隔符-------------------------------------------------------
班级 学号 姓名 迟到 旷课 早退 总分值
---- ---- ---- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
二班 02 李四 0.0 -0.5 0.0 -0.5
三班 03 王五 0.0 -0.5 0.0 -0.5
三班 04 赵六 0.0 0.0 0.0 -0.8
一班 01 张三 -0.3 0.0 0.0 -0.6(4 行受影响)简单明了,哇咔咔!
ps:你的进步就是我的成长!
select 班级,学号,姓名,
SUM(case 类别 when '迟到' then 分值 else 0 end) 迟到,
SUM(case 类别 when '旷课' then 分值 else 0 end) 旷课,
SUM(case 类别 when '早退' then 分值 else 0 end) 早退,
SUM(分值)总分值 from #ta where 时间 between '2012-05-02' and '2012-05-05' group by 班级,学号,姓名