当前位置: 代码迷 >> Sql Server >> 一条查询语句的追加有关问题,多谢大家
  详细解决方案

一条查询语句的追加有关问题,多谢大家

热度:86   发布时间:2016-04-24 10:02:25.0
一条查询语句的追加问题,谢谢大家!
本帖最后由 tf8439 于 2014-09-01 17:16:12 编辑
上次我在坛子里提问,好多大神给我回复,当时问题如下:

数据库表中有两个字段,一共假设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]
  相关解决方案