近来在做一个小开发的时候,对于名次的排序有点头大,麻烦大家帮看一下。
数据库结构:
用户编号 用户姓名 年度发帖 月度发帖 今日发帖
120501115 张三 1584 162 29
120522081 李四 487 327 0
121427000 XX县 0 0 0
121427157 王五 12 0 0
122227002 赵六 2514 399 15........现在的问题在于,用户编号的前六位是地域编号,如12代表A省,05、14、22分别是B市、C市、D市,120501代表A省B市E区,122227代表A省D市F县…………
客户要求在登录用户查看个人信息时,显示出他在全省、全市、全县的不同排名,如张三显示的是:
今年以来:
您是全省第二名,本市第一名,本区(县)第一名
本月以来:
您是全省第三名,本市第二名,本区(县)第一名
今天:
您是全省第一名,本市第一名,本区(县)第一名李四显示的是:
今年以来:
您是全省第三名,本市第二名,本区(县)第一名
本月以来:
您是全省第二名,本市第一名,本区(县)第一名
今天:
您的发帖量为0,不计算排名(只要是发帖量为0的,都可以直接不计算排名,当然这个步骤可以在ASP里来判断,SQL只要输出0就行了)
数据表中共有用户信息约二万条,暂时都在一个省内,约有二十个地市,近二百个区县的数据,年度、月度、本日的数据我可以用定时作业先统计好,但排名就有点头大,还要大家帮我考虑一下怎么做比较好呢?如果发帖量相同的情况下,如果能并列前名次最好(也就是说可以一个第一名,三个第二名,而不是一个第一名,三个第四名这种),如果难做到的话,并列后名次也行。感谢大家!
数据库结构:
用户编号 用户姓名 年度发帖 月度发帖 今日发帖
120501115 张三 1584 162 29
120522081 李四 487 327 0
121427000 XX县 0 0 0
121427157 王五 12 0 0
122227002 赵六 2514 399 15........现在的问题在于,用户编号的前六位是地域编号,如12代表A省,05、14、22分别是B市、C市、D市,120501代表A省B市E区,122227代表A省D市F县…………
客户要求在登录用户查看个人信息时,显示出他在全省、全市、全县的不同排名,如张三显示的是:
今年以来:
您是全省第二名,本市第一名,本区(县)第一名
本月以来:
您是全省第三名,本市第二名,本区(县)第一名
今天:
您是全省第一名,本市第一名,本区(县)第一名李四显示的是:
今年以来:
您是全省第三名,本市第二名,本区(县)第一名
本月以来:
您是全省第二名,本市第一名,本区(县)第一名
今天:
您的发帖量为0,不计算排名(只要是发帖量为0的,都可以直接不计算排名,当然这个步骤可以在ASP里来判断,SQL只要输出0就行了)
数据表中共有用户信息约二万条,暂时都在一个省内,约有二十个地市,近二百个区县的数据,年度、月度、本日的数据我可以用定时作业先统计好,但排名就有点头大,还要大家帮我考虑一下怎么做比较好呢?如果发帖量相同的情况下,如果能并列前名次最好(也就是说可以一个第一名,三个第二名,而不是一个第一名,三个第四名这种),如果难做到的话,并列后名次也行。感谢大家!
insert @Ta select '120501115', '张三', 1584, 162, 29
insert @Ta select '120522081', '李四', 487, 327, 0
insert @Ta select '121427000', 'XX县', 0, 0, 0
insert @Ta select '121427157', '王五', 12, 0, 0
insert @Ta select '122227002', '赵六', 2514, 399, 15
select
用户编号,用户姓名,
(select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 年度发帖>t.年度发帖)+1 as '年度省排名',
(select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 年度发帖>t.年度发帖)+1 as '年度市排名',
(select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 年度发帖>t.年度发帖)+1 as '年度区排名'
from
@Ta tselect
用户编号,用户姓名,
(select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 月度发帖>t.月度发帖)+1 as '月度省排名',
(select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 月度发帖>t.月度发帖)+1 as '月度市排名',
(select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 月度发帖>t.月度发帖)+1 as '月度区排名'
from
@Ta tselect
用户编号,用户姓名,
(select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 今日发帖>t.今日发帖)+1 as '今日省排名',
(select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 今日发帖>t.今日发帖)+1 as '今日市排名',
(select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 今日发帖>t.今日发帖)+1 as '今日区排名'
from
@Ta t(所影响的行数为 1 行)用户编号 用户姓名 年度省排名 年度市排名 年度区排名
-------------------- ---------- ----------- ----------- -----------
120501115 张三 2 1 1
120522081 李四 3 2 1
121427000 XX县 5 2 2
121427157 王五 4 1 1
122227002 赵六 1 1 1(所影响的行数为 5 行)用户编号 用户姓名 月度省排名 月度市排名 月度区排名
-------------------- ---------- ----------- ----------- -----------
120501115 张三 3 2 1
120522081 李四 2 1 1
121427000 XX县 4 1 1
121427157 王五 4 1 1
122227002 赵六 1 1 1(所影响的行数为 5 行)用户编号 用户姓名 今日省排名 今日市排名 今日区排名
-------------------- ---------- ----------- ----------- -----------
120501115 张三 1 1 1
120522081 李四 3 2 1
121427000 XX县 3 1 1
121427157 王五 3 1 1
122227002 赵六 2 1 1(所影响的行数为 5 行)
--您的发帖量为0,不计算排名 declare @Ta table(用户编号 nvarchar(20), 用户姓名 nvarchar(10), 年度发帖 int,月度发帖 int, 今日发帖 int)
insert @Ta select '120501115', '张三', 1584, 162, 29
insert @Ta select '120522081', '李四', 487, 327, 0
insert @Ta select '121427000', 'XX县', 0, 0, 0
insert @Ta select '121427157', '王五', 12, 0, 0
insert @Ta select '122227002', '赵六', 2514, 399, 15
select
用户编号,用户姓名,case when 年度发帖=0 then 0 else
(select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 年度发帖>t.年度发帖)+1 end as '年度省排名',
case when 年度发帖=0 then 0 else
(select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 年度发帖>t.年度发帖)+1 end as '年度市排名',
case when 年度发帖=0 then 0 else
(select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 年度发帖>t.年度发帖)+1 end as '年度区排名'
from
@Ta tselect
用户编号,用户姓名,case when 月度发帖=0 then 0 else
(select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 月度发帖>t.月度发帖)+1 end as '月度省排名',
case when 月度发帖=0 then 0 else
(select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 月度发帖>t.月度发帖)+1 end as '月度市排名',
case when 月度发帖=0 then 0 else
(select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 月度发帖>t.月度发帖)+1 end as '月度区排名'
from
@Ta tselect
用户编号,用户姓名,
case when 今日发帖=0 then 0 else
(select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 今日发帖>t.今日发帖)+1 end as '今日省排名',
case when 今日发帖=0 then 0 else
(select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 今日发帖>t.今日发帖)+1 end as '今日市排名',
case when 今日发帖=0 then 0 else
(select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 今日发帖>t.今日发帖)+1 end as '今日区排名'
from
@Ta t
用户编号 用户姓名 年度省排名 年度市排名 年度区排名
-------------------- ---------- ----------- ----------- -----------
120501115 张三 2 1 1
120522081 李四 3 2 1
121427000 XX县 0 0 0
121427157 王五 4 1 1
122227002 赵六 1 1 1(所影响的行数为 5 行)用户编号 用户姓名 月度省排名 月度市排名 月度区排名
-------------------- ---------- ----------- ----------- -----------
120501115 张三 3 2 1
120522081 李四 2 1 1
121427000 XX县 0 0 0
121427157 王五 0 0 0
122227002 赵六 1 1 1(所影响的行数为 5 行)用户编号 用户姓名 今日省排名 今日市排名 今日区排名
-------------------- ---------- ----------- ----------- -----------
120501115 张三 1 1 1
120522081 李四 0 0 0
121427000 XX县 0 0 0
121427157 王五 0 0 0
122227002 赵六 2 1 1(所影响的行数为 5 行)
insert @Ta select '120501115', '张三', 1584, 162, 29
insert @Ta select '120522081', '李四', 487, 327, 0
insert @Ta select '121427000', 'XX县', 0, 0, 0
insert @Ta select '121427157', '王五', 12, 0, 0
insert @Ta select '122227002', '赵六', 2514, 399, 15select
用户编号,用户姓名,[省排名],[市排名],[区排名]from
(select
用户编号,用户姓名,case when 年度发帖=0 then '' else '年度全省第'+rtrim(
(select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 年度发帖>t.年度发帖)+1)+'名' end as '省排名',
case when 年度发帖=0 then '' else '年度本市第'+rtrim(
(select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 年度发帖>t.年度发帖)+1)+'名'end as '市排名',
case when 年度发帖=0 then '' else '年度本区'+rtrim(
(select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 年度发帖>t.年度发帖)+1)+'名' end as '区排名',
[Order]=1
from
@Ta t
union all select
用户编号,用户姓名,case when 月度发帖=0 then '' else '月度全省第'+rtrim(
(select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 月度发帖>t.月度发帖)+1)+'名' end as '月度省排名',
case when 月度发帖=0 then '' else '月度全市第'+rtrim(
(select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 月度发帖>t.月度发帖)+1)+'名' end as '市排名',
case when 月度发帖=0 then '' else '月度区'+rtrim(
(select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 月度发帖>t.月度发帖)+1)+'名' end as '区排名',
[Order]=2
from
@Ta t
union all
select
用户编号,用户姓名,
case when 今日发帖=0 then '' else '今日省'+rtrim(
(select count(1) from @ta where left(用户编号,2)=left(t.用户编号,2) and 今日发帖>t.今日发帖)+1)+'名' end as '省排名',
case when 今日发帖=0 then '' else '今日市'+rtrim(
(select count(1) from @ta where left(用户编号,4)=left(t.用户编号,4) and 今日发帖>t.今日发帖)+1)+'名' end as '市排名',
case when 今日发帖=0 then '' else '今日区'+rtrim(
(select count(1) from @ta where left(用户编号,6)=left(t.用户编号,6) and 今日发帖>t.今日发帖)+1)+'名' end as '区排名',
[Order]=3
from
@Ta t
) tmp
order by 用户编号,用户姓名,[Order] asc
用户编号 用户姓名 省排名 市排名 区排名
-------------------- ---------- ------------------------ ------------------------ ----------------------
120501115 张三 年度全省第2名 年度本市第1名 年度本区1名
120501115 张三 月度全省第3名 月度全市第2名 月度区1名
120501115 张三 今日省1名 今日市1名 今日区1名
120522081 李四 年度全省第3名 年度本市第2名 年度本区1名
120522081 李四 月度全省第2名 月度全市第1名 月度区1名
120522081 李四
121427000 XX县
121427000 XX县
121427000 XX县
121427157 王五 年度全省第4名 年度本市第1名 年度本区1名
121427157 王五
121427157 王五
122227002 赵六 年度全省第1名 年度本市第1名 年度本区1名
122227002 赵六 月度全省第1名 月度全市第1名 月度区1名
122227002 赵六 今日省2名 今日市1名 今日区1名(所影响的行数为 15 行)