27,582
社区成员




if object_id('tempdb..#a','U') is not null drop table #a
create table #a (id tinyint,
name varchar(8),
check1 varchar(8),
evaluate varchar(4)
)
insert into #a
values(1,'张三','学习','优'),
(2,'张三','学习','优'),
(3,'张三','纪律','优'),
(4,'张三','纪律','良'),
(5,'张三','学习','差'),
(6,'张三','学习','优'),
(7,'李四','纪律','优'),
(8,'李四','学习','优'),
(9,'李四','纪律','良'),
(12,'李四','学习','差'),
(10,'李四','学习','优'),
(11,'李四','学习','良');
--能力展示语句
declare @sql varchar(5000)
select @sql =isnull(@sql,' ')+',count(case when evaluate ='+quotename(evaluate,'''')+' then 1 else null end) as '+quotename(evaluate,'''')+'' from #a group by evaluate
--print @sql
exec ('select name,check1 '+@sql+' from #a group by name,check1')
--结果展示
/*
name check1 差 良 优
-------- -------- ----------- ----------- -----------
李四 纪律 0 1 1
张三 纪律 0 1 1
李四 学习 1 1 2
张三 学习 1 0 3
警告: 聚合或其他 SET 操作消除了 Null 值。
(4 行受影响)
*/
--精通展示
select * from #a
pivot(count(id) for evaluate in ([优],[良],[差])) as a
--结果展示
/*
name check1 优 良 差
-------- -------- ----------- ----------- -----------
李四 纪律 1 1 0
张三 纪律 1 1 0
李四 学习 2 1 1
张三 学习 3 0 1
(4 行受影响)
*/
select name, [check], count(*) 考核总数,
COUNT(case when evaluate='优' then 1 end) 优,
COUNT(case when evaluate='良' then 1 end) 良,
COUNT(case when evaluate='差' then 1 end) 差
from stuInfo
group by name, [check]
SELECT
NAME,[Check],COUNT(*) AS 考核总数,
SUM(CASE evaluate WHEN N'优' THEN 1 ELSE 0 END) AS 优,
SUM(CASE evaluate WHEN N'良' THEN 1 ELSE 0 END) AS 良,
SUM(CASE evaluate WHEN N'差' THEN 1 ELSE 0 END) AS 差
FROM #Test
GROUP BY NAME,[Check]
ORDER BY NAME
或
SELECT NAME,[Check],优+良+差 AS 考核总数, 优,良,差
FROM ( SELECT name,[Check],evaluate
FROM #Test
) a PIVOT (COUNT(evaluate) FOR evaluate IN (优,良,差)) b
ORDER BY NAME
NAME Check 考核总数 优 良 差
------ ----- ----------- ----------- ----------- -----------
李四 纪律 3 2 1 0
李四 学习 3 1 1 1
张三 纪律 2 1 1 0
张三 学习 4 3 0 1IF OBJECT_ID('Test') IS NOT NULL
DROP TABLE Test
GO
CREATE TABLE Test(id INT IDENTITY(1,1),NAME VARCHAR(6),[CHECK] VARCHAR(4),evaluate VARCHAR(2))
INSERT INTO Test SELECT '张三','学习','优'
UNION ALL SELECT '张三','学习','优'
UNION ALL SELECT '张三','纪律','优'
UNION ALL SELECT '张三','纪律','良'
UNION ALL SELECT '张三','学习','差'
UNION ALL SELECT '张三','学习','优'
UNION ALL SELECT '李四','纪律','优'
UNION ALL SELECT '李四','学习','优'
UNION ALL SELECT '李四','纪律','良'
UNION ALL SELECT '李四','学习','差'
UNION ALL SELECT '李四','纪律','优'
UNION ALL SELECT '李四','学习','良'
--------------------------------------------------动态查询------------------------------------------------------------
DECLARE @Sql NVARCHAR(4000)
SET @sql='
SELECT NAME ''姓名'',[CHECK] ''考核项'',COUNT(*) AS ''考核总数'''
SELECT @sql=@sql+',sum(CASE evaluate WHEN '''+evaluate+''' THEN 1 ELSE 0 END) '''+evaluate+''''
FROM (SELECT DISTINCT evaluate FROM Test)a
SELECT @Sql=@Sql +' FROM dbo.Test
GROUP BY NAME,[CHECK] ORDER BY NAME DESC ,COUNT(*) DESC'
EXEC(@Sql)
---------------------------------------------------静态查询------------------------------------------------------------
SELECT NAME '姓名',[CHECK] '考核项',COUNT(*) AS '考核总数',sum(CASE WHEN evaluate='优' THEN 1 ELSE 0 END) '优'
,sum(CASE WHEN evaluate='良' THEN 1 ELSE 0 END) '良',sum(CASE WHEN evaluate='差' THEN 1 ELSE 0 END) '差' FROM dbo.Test
GROUP BY NAME,[CHECK] ORDER BY NAME DESC ,COUNT(*) DESC
---------------------------------------------------查询结果-------------------------------------------------------------
/*
姓名 考核项 考核总数 优 良 差
------ ---- ----------- ----------- ----------- -----------
张三 学习 4 3 0 1
张三 纪律 2 1 1 0
李四 学习 3 1 1 1
李四 纪律 3 2 1 0
*/
select name, check, count(1) 考核总数,
sum(case evaluate when '优' then 1 else 0 end) 优,
sum(case evaluate when '良' then 1 else 0 end) 良,
sum(case evaluate when '差' then 1 else 0 end) 差
from stuInfo
group by id, name, check