周次 学号 迟到 旷课 请假 早退
1 001 true false false false
1 009 false true false false
1 011 true false false false
1 021 true false false false
2 002 false false false true
2 012 false false false true
2 032 false false false true
3 004 false true false false
求解怎么用count统计每周迟到旷课早退请假的人数并且和group by 按周次进行分组,生成如下效果的表:
周次 迟到人数 旷课人数 早退人数 请假人数
1 3 1 0 0
2 0 0 3 0
3 0 1 0 0
求解啊, 谢谢
3 个解决方案
#1
SELECT [周次],[迟到人数]=COUNT(迟到),[旷课人数]=COUNT(旷课)...
FROM 表
WHERE 迟到='true' and 旷课='true' and ....
GROUP BY [周次]
#2
if object_id('[TB]') is not null drop table [TB]
go
create table [TB] (周次 int,学号 nvarchar(6),迟到 nvarchar(10),旷课 nvarchar(10),请假 nvarchar(10),早退 nvarchar(10))
insert into [TB]
select 1,'001','true','false','false','false' union all
select 1,'009','false','true','false','false' union all
select 1,'011','true','false','false','false' union all
select 1,'021','true','false','false','false' union all
select 2,'002','false','false','false','true' union all
select 2,'012','false','false','false','true' union all
select 2,'032','false','false','false','true' union all
select 3,'004','false','true','false','false'
select * from [TB]
SELECT 周次,SUM(迟到) AS 迟到,SUM(旷课) AS 旷课,
SUM(请假) AS 请假,
SUM(早退) AS 早退
FROM (
SELECT 周次,学号,SUM(CASE WHEN 迟到 = 'true' THEN 1 ELSE 0 END) AS 迟到,
SUM(CASE WHEN 旷课 = 'true' THEN 1 ELSE 0 END) AS 旷课,
SUM(CASE WHEN 请假 = 'true' THEN 1 ELSE 0 END) AS 请假,
SUM(CASE WHEN 早退 = 'true' THEN 1 ELSE 0 END) AS 早退
FROM dbo.TB
GROUP BY 周次,学号) T
GROUP BY 周次
/*
周次 迟到 旷课 请假 早退
1 3 1 0 0
2 0 0 0 3
3 0 1 0 0*/
#3
with tb(a,b,c,d,e,f) as
(select'1','001','true','false','false','false' union all select
'1','009','false','true','false','false' union all select
'1','011','true','false','false','false' union all select
'1','021','true','false','false','false' union all select
'2','002','false','false','false','true' union all select
'2','012','false','false','false','true' union all select
'2','032','false','false','false','true' union all select
'3','004','false','true','false','false'
)
select a 周次,count(case when c='true' then 1 else null end) 迟到人数,
count(case when d='true' then 1 else null end) 旷课人数,
count(case when e='true' then 1 else null end) 早退人数,
count(case when f='true' then 1 else null end) 请假人数 from tb
group by a
#1
SELECT [周次],[迟到人数]=COUNT(迟到),[旷课人数]=COUNT(旷课)...
FROM 表
WHERE 迟到='true' and 旷课='true' and ....
GROUP BY [周次]
#2
if object_id('[TB]') is not null drop table [TB]
go
create table [TB] (周次 int,学号 nvarchar(6),迟到 nvarchar(10),旷课 nvarchar(10),请假 nvarchar(10),早退 nvarchar(10))
insert into [TB]
select 1,'001','true','false','false','false' union all
select 1,'009','false','true','false','false' union all
select 1,'011','true','false','false','false' union all
select 1,'021','true','false','false','false' union all
select 2,'002','false','false','false','true' union all
select 2,'012','false','false','false','true' union all
select 2,'032','false','false','false','true' union all
select 3,'004','false','true','false','false'
select * from [TB]
SELECT 周次,SUM(迟到) AS 迟到,SUM(旷课) AS 旷课,
SUM(请假) AS 请假,
SUM(早退) AS 早退
FROM (
SELECT 周次,学号,SUM(CASE WHEN 迟到 = 'true' THEN 1 ELSE 0 END) AS 迟到,
SUM(CASE WHEN 旷课 = 'true' THEN 1 ELSE 0 END) AS 旷课,
SUM(CASE WHEN 请假 = 'true' THEN 1 ELSE 0 END) AS 请假,
SUM(CASE WHEN 早退 = 'true' THEN 1 ELSE 0 END) AS 早退
FROM dbo.TB
GROUP BY 周次,学号) T
GROUP BY 周次
/*
周次 迟到 旷课 请假 早退
1 3 1 0 0
2 0 0 0 3
3 0 1 0 0*/
#3
with tb(a,b,c,d,e,f) as
(select'1','001','true','false','false','false' union all select
'1','009','false','true','false','false' union all select
'1','011','true','false','false','false' union all select
'1','021','true','false','false','false' union all select
'2','002','false','false','false','true' union all select
'2','012','false','false','false','true' union all select
'2','032','false','false','false','true' union all select
'3','004','false','true','false','false'
)
select a 周次,count(case when c='true' then 1 else null end) 迟到人数,
count(case when d='true' then 1 else null end) 旷课人数,
count(case when e='true' then 1 else null end) 早退人数,
count(case when f='true' then 1 else null end) 请假人数 from tb
group by a