发个SQL 看看大家的SQL语句谁更简单

qxyywy 2012-10-18 04:43:54
SELECT person_id, work_year FROM info_person ip

---结果 person_id int,work_year int
2110020 4
2110067 5
2112274 6
2113775 7
2113841 8
2114508 9
2114870 10
2115337 11
2115408 7
2115431 5
2115610 6

需要对不同工作年限的个人进行统计 如下:

工作年限 数量 占比
1 15000 15.00%
2 15222 16.00%

请给出你认为够简单的SQL语句!
...全文
1765 55 打赏 收藏 转发到动态 举报
写回复
用AI写文章
55 条回复
切换为时间正序
请发表友善的回复…
发表回复
qxyywy 2012-10-23
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 的回复:]

直接写 写不出来 用存储过程吧
[/Quote]

朋友 楼上的已经有答案了 而且不只一种 根据你自己的需求选择最适合的
sdsxc 2012-10-23
  • 打赏
  • 举报
回复
直接写 写不出来 用存储过程吧
eyang2012 2012-10-23
  • 打赏
  • 举报
回复
0.0
tongfang123 2012-10-22
  • 打赏
  • 举报
回复
知道总比不知的好,活到老学到老
qxyywy 2012-10-20
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 的回复:]

要想真的“显摆”,还是能写出各种数据库都支持的SQL那才就好,知道了一两种数据库的一个函数,没啥的,不过知道总比不知道好,还是恭喜楼主。
[/Quote]
jianshao810 2012-10-20
  • 打赏
  • 举报
回复
Select work_year AS 工作年限,Count(work_year) AS 数量,(cast( Count(work_year) as decimal(18,5))/cast(Count(*) as decimal(18,5))) AS 占比 from info_person GROUP BY work_year


just_for_download2 2012-10-19
  • 打赏
  • 举报
回复
要想真的“显摆”,还是能写出各种数据库都支持的SQL那才就好,知道了一两种数据库的一个函数,没啥的,不过知道总比不知道好,还是恭喜楼主。
qxyywy 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 的回复:]

从性能上讲,当数据越大group by的性能会比distinct更好。
[/Quote]
自然 实际我上面的SQL性能不高 与子查询 对比一下就知道了
查询开销很大
sharpidd 2012-10-19
  • 打赏
  • 举报
回复
从性能上讲,当数据越大group by的性能会比distinct更好。
cd731107 2012-10-19
  • 打赏
  • 举报
回复
select work_year as 工作年限 ,count(*) as 数量,
convert(decimal(18,2),count(*)*100./(select count(*) from info_person)) as 所占比例
from info_person
group by work_year
six-years 2012-10-19
  • 打赏
  • 举报
回复
围观围观 子查询俺喜欢
zhanglong_longlong 2012-10-19
  • 打赏
  • 举报
回复
楼上说的很清楚了
qxyywy 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 32 楼 的回复:]

引用 10 楼 的回复:

引用 8 楼 的回复:

select work_year,count(*),count(*)*1./num from
(select *,count(*)over() from info_person) t group by work_year,num

貌似你的语句没发完整
加%号,你自己不会?
[/Quote]

不是%号的问题 是你的 num 别名问题
qxyywy 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 的回复:]

partition by是分组排序,不是统计总数
[/Quote]

我只知道是分组排序 ,但用聚合函数搭配OVER不就解决了

SELECT distinct work_year
,COUNT(*) OVER (PARTITION BY 0) AS all_count
,COUNT(*) OVER (PARTITION BY work_year) AS part_count
,ROUND(CONVERT(FLOAT,COUNT(*) OVER (PARTITION BY work_year))*100/CONVERT(FLOAT,COUNT(*) OVER (PARTITION BY 0)),2) AS part_point
FROM info_person
快溜 2012-10-19
  • 打赏
  • 举报
回复
partition by是分组排序,不是统计总数
快溜 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 8 楼 的回复:

select work_year,count(*),count(*)*1./num from
(select *,count(*)over() from info_person) t group by work_year,num

貌似你的语句没发完整
[/Quote]加%号,你自己不会?
Delta 2012-10-19
  • 打赏
  • 举报
回复
学习的不好,来看看,学习一下
友君快乐 2012-10-19
  • 打赏
  • 举报
回复
我觉得最简单的不是一条语句就完成,我觉得不论是程序还是sql语句,最清晰明确才是最重要的
如果你一条语句嵌套太多,看着都累
可以用几条语句来解决,一看就能让人看懂才是最重要的。
qxyywy 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 的回复:]

引用 41 楼 的回复:

8楼一早都写出来了啊

在啰嗦一句,我觉得此帖至少的给8楼一半的分
[/Quote]

分很重要嘛? 我觉得这些大牛能为提供解决问题的方案 释疑才是最值得肯定的
qxyywy 2012-10-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

select work_year,count(*),count(*)*1./num from
(select *,count(*)over() num from info_person) t group by work_year,num
[/Quote]

8楼确实优先写了出来的

[Quote=引用 21 楼 的回复:]

over函数
SQL code

CREATE TABLE WBT
(
person_id int,
work_year int
)
INSERT INTO WBT
SELECT 2110020,5 UNION ALL
SELECT 2112274,6 UNION ALL
SELECT 2113775,7 UNION ALL
SELECT 2113841,8 UN……
[/Quote]
这个也是正确的

还有29楼 38楼的结果页是正确的
另外34楼用的分段查询 也是能出来的

这些SQL语句的性能应该是8和21的最优

这儿我用34楼的做法是 想针对在统计结果还需要其他字段等 的时候用此种可以方便的进行查询 但性能不一定高

在底层的查询要先尽力写出够优化,简单的SQL 尤其是在统计方面的SQL更应该注意,对自己的SQL可以进行查询开销检查 取更优者

我只是菜鸟一个 此题和上面的一些看法只是个人看法 晚上回家结贴
加载更多回复(34)

62,050

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

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