求一条SQL语句(在线等解)

party620 2013-08-09 05:12:58
求:每个学生每个月迟到总数及占总数的百分比,
表a记录的是学生每天迟到信息
表a:id,stucode(学生编号),Reas(迟到理由),lateDate(迟到日期),id为主键

相关数据:
id stucode Reas lateDate
1001 001 2013-01-02
1002 002 2013-01-12
1003 001 2013-01-14
1004 001 2013-01-15
1005 003 2013-03-01
1006 004 2013-03-01
1007 001 2013-03-02
1008 002 2013-03-04
1009 003 2013-5-1

结果:
学生标号 月份 每月迟到次数 比例
001 2013-01 3 30%
001 2013-03 1 11%
002 2013-01 1 11%
002 2013-03 1 11%
003 2013-03 1 11%
003 2013-05 1 11%
004 2013-03 1 11%
...全文
259 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
老瓷 2013-08-12
  • 打赏
  • 举报
回复
--请注明 For SQLServer 2005 With Cte AS(......)
lzw_0736 2013-08-10
  • 打赏
  • 举报
回复

create table #tab(
id int,stucode varchar(20),Reas varchar(20),lateDate datetime 
)
insert into #tab
select '1001','001','','2013-01-02' union all
select '1002','002','','2013-01-12' union all
select '1003','001','','2013-01-14' union all
select '1004','001','','2013-01-15' union all
select '1005','003','','2013-03-01' union all
select '1006','004','','2013-03-01' union all
select '1007','001','','2013-03-02' union all
select '1008','002','','2013-03-04' union all
select '1009','003','','2013-05-01'
;
WITH a1 AS
(
SELECT convert(CHAR(7),lateDate,20) mm,stucode
FROM #tab
)
SELECT mm,stucode,CAST(CAST(100.*COUNT(*)/(SELECT COUNT(*) FROM a1) AS decimal(4,2)) AS VARCHAR)+'%'
FROM a1
GROUP BY mm,stucode
party620 2013-08-10
  • 打赏
  • 举报
回复
引用
tangguangqiang 习惯性蹭分
我的数据有问题 应该不是同一年的,可能是2012,2013,2014年的数据 而且按你写的,报错 消息 8120,级别 16,状态 1,第 1 行 选择列表中的列 'a.stucode' 无效,因为该列没有包含在聚合函数或 GROUP BY 子句中。 消息 207,级别 16,状态 1,第 2 行 列名 '月份' 无效。
李迎春82 2013-08-10
  • 打赏
  • 举报
回复
仲有高手,我闪。
Neo_whl 2013-08-09
  • 打赏
  • 举报
回复
习惯性蹭分 2013-08-09
  • 打赏
  • 举报
回复
如果只计算同一年的可以这样

select stucode as 学生标号,month(latedate) as 月份,count(stucode) as 每月迟到数
,count(stucode)/(select count(stucode) from a where month(stucode)=月份 )*100. as 比例
from a group by month(latedate)
曲军昌 2013-08-09
  • 打赏
  • 举报
回复

create table tab(
id int,stucode varchar(20),Reas varchar(20),lateDate datetime 
)
insert into tab
select '1001','001','','2013-01-02' union all
select '1002','002','','2013-01-12' union all
select '1003','001','','2013-01-14' union all
select '1004','001','','2013-01-15' union all
select '1005','003','','2013-03-01' union all
select '1006','004','','2013-03-01' union all
select '1007','001','','2013-03-02' union all
select '1008','002','','2013-03-04' union all
select '1009','003','','2013-05-01'
-------------查询语句--------------------------------------------------------
with cte as
(
select id,stucode,left(convert(varchar,lateDate,121),7)as lateDate from tab
),cte1 as
(
select stucode N'学生编号',lateDate N'月份',count(*)as N'每月迟到次数'
from cte c
group by stucode,lateDate
)
select  学生编号,月份,[每月迟到次数],
convert(varchar,(convert(numeric(18,2),(convert(numeric(18,2),[每月迟到次数])/(select count(*) from cte))*100)))+'%' as '比例'
from cte1
order by 学生编号
--查询结果----------------------------------------------------------------------------------
学生编号                 月份             每月迟到次数      比例
-------------------- -------------- ----------- -------------------------------
001                  2013-01        3           33.33%
001                  2013-03        1           11.11%
002                  2013-01        1           11.11%
002                  2013-03        1           11.11%
003                  2013-03        1           11.11%
003                  2013-05        1           11.11%
004                  2013-03        1           11.11%

(7 行受影响)

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧