sql得分排名

c48111926 2010-01-14 12:11:25
select Inspect_name,office,IPfrom,
检查次数=sum(case when 数量>120 then 1 else 0 end),
A=sum(case when A>120 then 1 else 0 end),
B=sum(case when B>120 then 1 else 0 end),

双休日=sum(case when A>120 then 1 else 0 end),
总分=sum(case when 双休日>120 then 1 else 0 end)*1 +sum(case when A>120 then 1 else 0 end)*2 +sum(case when B>120 then 1 else 0 end)*1
from (select Inspect_name,office,IPfrom,convert(varchar(10),intime,120) as intime,sum(vtime) as 数量,
sum(case when rank= 'A' then vtime else 0 end) A,
sum(case when rank = 'B' then vtime else 0 end) B,

sum(case when datepart(dw,intime) = '1' or datepart(dw,intime) = '7' then vtime else 0 end) 双休日
from jcxs group by Inspect_name,office,IPfrom,convert(varchar(10),intime,120) )t group by Inspect_name,office,IPfrom order by 总分 desc
上面的sql可以查询我想要的信息,只是现在我想要个排名,就是“总分”排名,比如如果出现
张 20分 1
王 19分 2
李 19分 2
孙 17分 3
类似这样的排名
...全文
215 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
c48111926 2010-01-16
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 sql77 的回复:]
SQL codeselect
Inspect_name,office,IPfrom,
检查次数=sum(casewhen 数量>120then1else0end),
A=sum(casewhen A>120then1else0end),
B=sum(casewhen B>120then1else0end),

双休日=sum(casewhen A>120then1else0end),
?-
[/Quote]老师我想查双休日的记录怎么查呀,我是这样查的可是好像不对 双休日=sum(case when datepart(dw,vdatetime2) = 1 or datepart(dw,vdatetime2) = 7 then vtime else 1 end)
--小F-- 2010-01-14
  • 打赏
  • 举报
回复
2005用dense_rank() over排序连续
--小F-- 2010-01-14
  • 打赏
  • 举报
回复
---2000
--示例数据
CREATE TABLE tb(Name varchar(10),Score decimal(10,2))
INSERT tb SELECT 'aa',99
UNION ALL SELECT 'bb',56
UNION ALL SELECT 'cc',56
UNION ALL SELECT 'dd',77
UNION ALL SELECT 'ee',78
UNION ALL SELECT 'ff',76
UNION ALL SELECT 'gg',78
UNION ALL SELECT 'ff',50
GO

--1. 名次生成方式1,Score重复时合并名次
SELECT *,Place=(SELECT COUNT(DISTINCT Score) FROM tb WHERE Score>=a.Score)
FROM tb a
ORDER BY Place
/*--结果
Name Score Place
---------------- ----------------- -----------
aa 99.00 1
ee 78.00 2
gg 78.00 2
dd 77.00 3
ff 76.00 4
bb 56.00 5
cc 56.00 5
ff 50.00 6
--*/



--2. 名次生成方式2,Score重复时保留名次空缺
SELECT *,Place=(SELECT COUNT(Score) FROM tb WHERE Score>a.Score)+1
FROM tb a
ORDER BY Place
/*--结果
Name Score Place
--------------- ----------------- -----------
aa 99.00 1
ee 78.00 2
gg 78.00 2
dd 77.00 4
ff 76.00 5
bb 56.00 6
cc 56.00 6
ff 50.00 8
--*/
黄_瓜 2010-01-14
  • 打赏
  • 举报
回复
--借用77的数据
if object_id('[TB]') is not null drop table [TB]
go
create table [TB]([A] varchar(2),[B] varchar(4))
insert [TB]
select '张','20分'union all
select '王','19分'union all
select '李','19分'union all
select '孙','17分'

select a,b, aa=dense_rank() over(order by b desc) from tb
/*
a b aa
---- ---- --------------------
张 20分 1
王 19分 2
李 19分 2
孙 17分 3

(4 行受影响)
*/
aaajedll 2010-01-14
  • 打赏
  • 举报
回复
樓上正解
SQL77 2010-01-14
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- Author :SQL77(只为思齐老)
-- Date :2010-01-14 08:22:28
-- Version:
-- Microsoft SQL Server 2000 - 8.00.194 (Intel X86)
-- Aug 6 2000 00:57:48
-- Copyright (c) 1988-2000 Microsoft Corporation
-- Desktop Engine on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[TB]
if object_id('[TB]') is not null drop table [TB]
go
create table [TB]([A] varchar(2),[B] varchar(4),[C] int)
insert [TB]
select '张','20分',1 union all
select '王','19分',2 union all
select '李','19分',2 union all
select '孙','17分',3
--------------开始查询--------------------------

select A,B,(SELECT COUNT(DISTINCT B) FROM TB WHERE B>=T.B)AS 排名 from [TB] T
----------------结果----------------------------
/*

(所影响的行数为 4 行)

A B 排名
---- ---- -----------
张 20分 1
王 19分 2
李 19分 2
孙 17分 3

(所影响的行数为 4 行)


*/
c48111926 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fredrickhu 的回复:]
SQL code;with fas
(select Inspect_name,office,IPfrom,
检查次数=sum(casewhen 数量>120then1else0end),
A=sum(casewhen A>120then1else0end),
B=sum(casewhen B>120then1else0end),

双休日=sum(casewhen A>120then1el?-
[/Quote]还有老师能不创建临时表么?直接写在这里
SQL77 2010-01-14
  • 打赏
  • 举报
回复
select
Inspect_name,office,IPfrom,
检查次数=sum(case when 数量>120 then 1 else 0 end),
A=sum(case when A>120 then 1 else 0 end),
B=sum(case when B>120 then 1 else 0 end),

双休日=sum(case when A>120 then 1 else 0 end),
总分=sum(case when 双休日>120 then 1 else 0 end)*1
+sum(case when A>120 then 1 else 0 end)*2 +sum(case when B>120 then 1 else 0 end)*1 INTO #TT
from

(select
Inspect_name,office,IPfrom,
convert(varchar(10),intime,120) as intime,sum(vtime) as 数量,
sum(case when rank= 'A' then vtime else 0 end) A,
sum(case when rank = 'B' then vtime else 0 end) B,

sum(case when datepart(dw,intime) = '1' or datepart(dw,intime) = '7' then vtime else 0 end) 双休日

from
jcxs
group by Inspect_name,office,IPfrom,convert(varchar(10),intime,120)

)t


group by Inspect_name,office,IPfrom order by 总分 desc
c48111926 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fredrickhu 的回复:]
SQL code;with fas
(select Inspect_name,office,IPfrom,
检查次数=sum(casewhen 数量>120then1else0end),
A=sum(casewhen A>120then1else0end),
B=sum(casewhen B>120then1else0end),

双休日=sum(casewhen A>120then1el?-
[/Quote]老师怎么放入临时表啊?
SQL77 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 c48111926 的回复:]
引用 4 楼 fredrickhu 的回复:
SQL code---2000
--示例数据CREATETABLE tb(Namevarchar(10),Scoredecimal(10,2))INSERT tbSELECT'aa',99UNIONALLSELECT'bb',56UNIONALLSELECT'cc',56UNIONALLSELECT'dd',77UNIONALLSELECT'ee',78UNIONALLSELECT'ff',76U?-
Inspect_name这是名字字段  总分 老师帮我把您给的句子放在我句子里一个该放的位置呗,真没搞明白
[/Quote]
你说的啥,想添加字段,你随便添加都行的,不过不能跟排名扯上关系
--小F-- 2010-01-14
  • 打赏
  • 举报
回复
总体意思就是把你写的那一堆放入CTE或者临时表 然后再按照上面的来查
--小F-- 2010-01-14
  • 打赏
  • 举报
回复
;with f as
(select Inspect_name,office,IPfrom,
检查次数=sum(case when 数量>120 then 1 else 0 end),
A=sum(case when A>120 then 1 else 0 end),
B=sum(case when B>120 then 1 else 0 end),

双休日=sum(case when A>120 then 1 else 0 end),
总分=sum(case when 双休日>120 then 1 else 0 end)*1 +sum(case when A>120 then 1 else 0 end)*2 +sum(case when B>120 then 1 else 0 end)*1
from (select Inspect_name,office,IPfrom,convert(varchar(10),intime,120) as intime,sum(vtime) as 数量,
sum(case when rank= 'A' then vtime else 0 end) A,
sum(case when rank= 'B' then vtime else 0 end) B,
sum(case when datepart(dw,intime) = '1' or datepart(dw,intime) = '7' then vtime else 0 end) 双休日
from jcxs group by Inspect_name,office,IPfrom,convert(varchar(10),intime,120) )t group by Inspect_name,office,IPfrom order by 总分 desc )

select A,B,(SELECT COUNT(DISTINCT B) FROM f WHERE B>=T.B)AS 排名 from f T
c48111926 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 fredrickhu 的回复:]
SQL code---2000
--示例数据CREATETABLE tb(Namevarchar(10),Scoredecimal(10,2))INSERT tbSELECT'aa',99UNIONALLSELECT'bb',56UNIONALLSELECT'cc',56UNIONALLSELECT'dd',77UNIONALLSELECT'ee',78UNIONALLSELECT'ff',76U?-
[/Quote]Inspect_name这是名字字段 总分 老师帮我把您给的句子放在我句子里一个该放的位置呗,真没搞明白
c48111926 2010-01-14
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sql77 的回复:]
SQL code----------------------------------------------------------------
-- Author :SQL77(只为思齐老)
-- Date :2010-01-14 08:22:28
-- Version:
-- Microsoft SQL Server 2000 - 8.00.194 (Intel X86)
?-
[/Quote]Inspect_name这是名字字段 总分 老师帮我把您给的句子放在我句子里一个该放的位置呗,真没搞明白

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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