永发信息网

求统计人员在每个城市的活动情况(排序)的SQL语句

答案:1  悬赏:60  手机版
解决时间 2021-01-14 16:15
  • 提问者网友:遁入空寂
  • 2021-01-14 04:17
求统计人员在每个城市的活动情况(排序)的SQL语句
最佳答案
  • 五星知识达人网友:轻熟杀无赦
  • 2021-01-14 05:03
这种排序要求最恰当实现方案应该在程序端用编程的方法解决,而不应该在数据库端用SQL语言来解决。因为SQL属于描述性的且是针对集合的语言,用它解决个体记录间比较的问题是强人所难,往往吃力不讨好。如果仅仅是偶尔为之,可在存储过程里调用游标予以实现。另外,如果数据库版本支持ROW_NUMBER函数的情况下,纯SQL解决可部分实现,但是不管如何这类需求在数据库端解决所产生的系统开销都偏高。


下面是利用ROW_NUMBE函数列出每个人员前三个活动次数最多的城市与次数,横向按次数排序用逗号连接的SQL语句:
select a.姓名,(
case b.n when 1 then b.城市 + '(' + cast(b.次数 as varchar(10)) + ')' 
else '' end + 
case b.n when 2 then ',' + b.城市 + '(' + cast(b.次数 as varchar(10)) + ')' 
else '' end + 
case b.n when 3 then ',' + b.城市 + '(' + cast(b.次数 as varchar(10)) + ')' 
else '' end) as 活动情况 
from (select distinct 姓名 from 表a) a,
(select *,ROW_NUMBER() OVER(PARTITION BY 姓名 
ORDER BY 次数 DESC) n from 表a) b 
where a.姓名=b.姓名;

注意即使数据库支持ROW_NUMBER函数,上述SQL语句也不建议运行于频繁操作的生产环节。
追答之前给的sql代码考虑不周,现更改如下
select t.姓名,(
t1.城市 + '(' + cast(t1.次数 as varchar(10)) + ')' +
case t2.n when 2 then ',' + t2.城市 + '(' + cast(t2.次数 as varchar(10)) + ')'
else '' end +
case t3.n when 3 then ',' + t3.城市 + '(' + cast(t3.次数 as varchar(10)) + ')'
else '' end) as 活动情况 from
(select distinct 姓名 from 表a) t
left join
(select * from
(select *,ROW_NUMBER() OVER(PARTITION BY 姓名
ORDER BY 次数 DESC) n from 表a)
where n=1)t1 on t.姓名=t1.姓名
left join
(select * from
(select *,ROW_NUMBER() OVER(PARTITION BY 姓名
ORDER BY 次数 DESC) n from 表a)
where n=2)t2 on t.姓名=t2.姓名
left join
(select * from
(select *,ROW_NUMBER() OVER(PARTITION BY 姓名
ORDER BY 次数 DESC) n from 表a)
where n=3)t3 on t.姓名=t3.姓名;再优化一些
SELECt tt.姓名,
max(tt.c1) + max(tt.c2) + max(tt.c3) AS 活动情况
FROM (select t.姓名,
case t.n when 1 then
t.城市 + '(' + cast(t.次数 as varchar(10)) + ')'
else '' end as c1,
case t.n when 2 then
',' + t.城市 + '(' + cast(t.次数 as varchar(10)) + ')'
else '' end as c2,
case t.n when 2 then
',' + t.城市 + '(' + cast(t.次数 as varchar(10)) + ')'
else '' end as c3
from (select *,ROW_NUMBER() OVER(PARTITION BY 姓名
ORDER BY 次数 DESC) n from 表a) t where n<=3) tt
GROUP BY tt.姓名;
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯