上次我在坛子里提问,好多大神给我回复,当时问题如下:
数据库表中有两个字段,一共假设7条数据,字段和数据如下:
name score
张三 5分
张三 4分
张三 5分
李四 3分
李四 5分
李四 5分
李四 4分
我想写出一条sql语句,能同时统计张三和李四一共分别得了多少5分,其他得分共多少,请问能实现吗?谢谢大家指点!
实际输出期望结果如下:
张三同学本学期共得5分2个,其他1个。
张三同学本学期共得5分2个,其他2个。
以下是roy_88版主大神的回复,很牛。非常感谢!我想再追问一下,如果我想算其中某位同学一共有多少次成绩(5分和非5分全算上),还有这位同学他得5分的次数占总次数的百分比是多少?应该怎么写,跪谢!
use Tempdb
go
--> -->
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([name] nvarchar(2),[score] nvarchar(2))
Insert #T
select N'张三',N'5分' union all
select N'张三',N'4分' union all
select N'张三',N'5分' union all
select N'李四',N'3分' union all
select N'李四',N'5分' union all
select N'李四',N'5分' union all
select N'李四',N'4分' union ALL
select N'王五',N'4分' --加一条王五
Go
SELECT [name]+N'同学本学期共得5分'+RTRIM(SUM(CASE WHEN [score]=N'5分' THEN 1 ELSE 0 END))+N'个,其他'+RTRIM(SUM(CASE WHEN [score]!=N'5分' THEN 1 ELSE 0 END))+N'个' AS Display
FROM #T AS a
GROUP BY [name]
/*
李四同学本学期共得5分2个,其他2个
王五同学本学期共得5分0个,其他1个
张三同学本学期共得5分2个,其他1个
*/
------解决方案--------------------
CREATE TABLE #t
(
NAME NVARCHAR(32),
score INT
)
INSERT INTO #t(name,score) VALUES(N'张三',5)
INSERT INTO #t(name,score) VALUES(N'张三',4)
INSERT INTO #t(name,score) VALUES(N'张三',5)
INSERT INTO #t(name,score) VALUES(N'李四',3)
INSERT INTO #t(name,score) VALUES(N'李四',5)
INSERT INTO #t(name,score) VALUES(N'李四',5)
INSERT INTO #t(name,score) VALUES(N'李四',4)
SELECT t1.NAME, t1.FiveScoreCounter,CAST(t1.FiveScoreCounter * 1.0 / t2.SumCounter AS DECIMAL(12,4)) 'ratio' FROM (
SELECT NAME ,COUNT(NAME) 'FiveScoreCounter' FROM #t WHERE score = 5
GROUP BY NAME)t1 INNER JOIN
(SELECT NAME,COUNT(NAME) 'SumCounter' FROM #t GROUP BY NAME)t2 ON t1.NAME = t2.name
ORDER BY t1.NAME

------解决方案--------------------
SELECT [name]+N'同学本学期共得5分'+RTRIM(SUM(CASE WHEN [score]=N'5分' THEN 1 ELSE 0 END))+
N'个,其他'+RTRIM(SUM(CASE WHEN [score]!=N'5分' THEN 1 ELSE 0 END))+
N'个,共有'+RTRIM(COUNT(*))+
N'次成绩,得5分的次数占总次数的百分比是'+
RTRIM(CAST(100.0*SUM(CASE WHEN [score]=N'5分' THEN 1 ELSE 0 END)/COUNT(*) AS DECIMAL(4,2)))+N'%'
AS Display
FROM #T AS a
GROUP BY [name]