求一条SQL语句

fcxxfcxx 2018-06-11 07:56:55
成绩表:
序号 学校 姓名 语文 数学 总分
1 学校1 张1 88 77 165
2 学校1 张2 88 88 176
3 学校2 张3 88 99 187
...............................
结果:
上表中总分在前1000名学生中各学校学生所占比例。
序号 学校 人数 前1000名比例
1 学校1 200 20%
2 学校2 100 10%
3 学校3 50 5%
3 学校4 0 0%
...全文
852 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
二月十六 2018-06-11
  • 打赏
  • 举报
回复
引用 2 楼 fcxxfcxx 的回复:
请问一下如何改为一条select语句?
上边那个测试数据不用管。
SELECT t1.学校,
       COUNT(1) AS 人数,
       RTRIM(   (CONVERT(FLOAT, COUNT(1)) /
                 (
                     SELECT COUNT(1) FROM (SELECT TOP 1000 * from #T ORDER BY 总分 desc)t2
                 )
                ) * 100
            ) + '%' AS 比例
FROM (SELECT TOP 1000 * from #T ORDER BY 总分 desc)t1
GROUP BY t1.学校;
fcxxfcxx 2018-06-11
  • 打赏
  • 举报
回复
请问一下如何改为一条select语句?
二月十六 2018-06-11
  • 打赏
  • 举报
回复
--测试数据
if not object_id(N'Tempdb..#T') is null
drop table #T
Go
Create table #T([序号] int,[学校] nvarchar(23),[姓名] nvarchar(22),[语文] int,[数学] int,[总分] int)
Insert #T
select 1,N'学校1',N'张1',88,77,165 union all
select 2,N'学校1',N'张2',88,88,176 union all
select 3,N'学校2',N'张3',88,99,187
Go
--测试数据结束
;WITH cte AS(
SELECT TOP 1000 * from #T ORDER BY 总分 desc
)
SELECT cte.学校,
COUNT(1) AS 人数,
RTRIM( (CONVERT(FLOAT, COUNT(1)) /
(
SELECT COUNT(1) FROM cte
)
) * 100
) + '%' AS 比例
FROM cte
GROUP BY cte.学校;



RINK_1 2018-06-11
  • 打赏
  • 举报
回复
如果是并列排名,后续排名继续保持连续,同时没有达到前1000名的学校也统计在内的,试试下面的。

select distinct 学校,
SUM(case when seq<=1000 then 1 else 0 end) over (partition by 学校) as 人数,
cast(cast(((SUM(case when seq<=1000 then 1 else 0 end) over (partition by 学校)*1.0)/SUM(case when seq<=1000 then 1 else 0 end) over ())*100 as decimal(12,2)) as varchar)+'%' as 比例 
from
(select *,DENSE_RANK() over (order by 总分 desc) as seq from #T) as A


二月十六 2018-06-11
  • 打赏
  • 举报
回复
引用 4 楼 weixin_42254420 的回复:
[quote=引用 3 楼 sinat_28984567 的回复:] [quote=引用 2 楼 fcxxfcxx 的回复:] 请问一下如何改为一条select语句?
上边那个测试数据不用管。
SELECT t1.学校,
       COUNT(1) AS 人数,
       RTRIM(   (CONVERT(FLOAT, COUNT(1)) /
                 (
                     SELECT COUNT(1) FROM (SELECT TOP 1000 * from #T ORDER BY 总分 desc)t2
                 )
                ) * 100
            ) + '%' AS 比例
FROM (SELECT TOP 1000 * from #T ORDER BY 总分 desc)t1
GROUP BY t1.学校;
[/quote] 想问一下这里为什么要区分t1和t2呢[/quote] 习惯……不喜欢把临时表的名字写成一样的,虽然有时候没错
于佳祺Cyril 2018-06-11
  • 打赏
  • 举报
回复
引用 3 楼 sinat_28984567 的回复:
[quote=引用 2 楼 fcxxfcxx 的回复:] 请问一下如何改为一条select语句?
上边那个测试数据不用管。
SELECT t1.学校,
       COUNT(1) AS 人数,
       RTRIM(   (CONVERT(FLOAT, COUNT(1)) /
                 (
                     SELECT COUNT(1) FROM (SELECT TOP 1000 * from #T ORDER BY 总分 desc)t2
                 )
                ) * 100
            ) + '%' AS 比例
FROM (SELECT TOP 1000 * from #T ORDER BY 总分 desc)t1
GROUP BY t1.学校;
[/quote] 想问一下这里为什么要区分t1和t2呢

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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