求一个统计的SQL

xieganlin 2012-02-20 04:47:17
就比如说。我一个班投票选三好学生,一个学生必须投四个不同的人。投完之后让你统计出前四名的学生,并列名次的也要取出来(就是说第四名有二个,其它名次一个,那么取出的记录应该是五条)。
也就是说数据库表是有 第一票,第二票,第三票,第四票。四个字段。
请问这SQL在access中如何写??
...全文
87 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2012-02-21
  • 打赏
  • 举报
回复

建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://topic.csdn.net/u/20091130/20/8343ee6a-417c-4c2d-9415-fa46604a00cf.html

1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)

这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。

xieganlin 2012-02-21
  • 打赏
  • 举报
回复
没人知道吗?自己顶一下
xieganlin 2012-02-21
  • 打赏
  • 举报
回复
现在我就是要取前四名.有并列的也要取.就什么排名不用管.
ACMAIN_CHM 2012-02-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xieganlin 的回复:]

现在我就是要取前四名.有并列的也要取.请问应该如何取啊!急啊!!
[/Quote]你的排名是正常的排名方法吗?比如运动会的。

并列第一后,就没有第二了!
WWWWA 2012-02-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xieganlin 的回复:]

现在我就是要取前四名.有并列的也要取.请问应该如何取啊!急啊!!
[/Quote]
贴数据及要求结果贴出来看看
xieganlin 2012-02-21
  • 打赏
  • 举报
回复
现在我就是要取前四名.有并列的也要取.请问应该如何取啊!急啊!!
WWWWA 2012-02-21
  • 打赏
  • 举报
回复





SELECT * FROM (
SELECT TOP 4 JS FROM (
SELECT DISTINCT JS FROM (

SELECT NUM1, COUNT(*) AS JS FROM
(SELECT NUM1 FROM TEST1
UNION ALL
SELECT NUM2 FROM TEST1
UNION ALL
SELECT NUM3 FROM TEST1
UNION ALL
SELECT NUM4 FROM TEST1) A
GROUP BY NUM1 ) ) ORDER BY 1 DESC) A1
INNER JOIN
(SELECT NUM1, COUNT(*) AS JS FROM
(SELECT NUM1 FROM TEST1
UNION ALL
SELECT NUM2 FROM TEST1
UNION ALL
SELECT NUM3 FROM TEST1
UNION ALL
SELECT NUM4 FROM TEST1) GROUP BY NUM1) B1 ON A1.JS=B1.JS ORDER BY A1.JS DESC
ACMAIN_CHM 2012-02-21
  • 打赏
  • 举报
回复
select a.*
from (
select X,count(*) as cnt from (
select num1 as X from test1
union all
select num2 from test1
union all
select num3 from test1
union all
select num4 from test1
) group by X
) a , (
select top 4 cnt from (
select count(*) as cnt from (
select num1 as X from test1
union all
select num2 from test1
union all
select num3 from test1
union all
select num4 from test1
) group by X
) group by cnt
order by 1 desc
) b
where a.cnt=b.cnt



X cnt
王五 5
李四 5
张三 4
刘六 4
李一 3
谢五 2
xieganlin 2012-02-21
  • 打赏
  • 举报
回复
create table test1
(
id1 varchar(10),
num1 varchar(4),
num2 varchar(4),
num3 varchar(4),
num4 varchar(4)
)
insert into test1 select '01','张三','李四','王五','刘六'
insert into test1 select '01','张七','李四','谢五','刘六'
insert into test1 select '01','张三','李一','王五','刘三'
insert into test1 select '01','张三','李四','王五','刘六'
insert into test1 select '01','张时','李四','王五','李一'
insert into test1 select '01','张三','李你','李一','刘六'
insert into test1 select '01','张在','李四','王五','谢五'

想得到统计结果中前四名的人员.有并列名次的也要取出来.
如可能结果:
姓名 得票数
李四 5
王五 5
张三 4
刘六 4
李一 3
谢五 2

使用的数据库为Access 2003

请问这样的SQL 如何写.望高手相助!!!
ACMAIN_CHM 2012-02-20
  • 打赏
  • 举报
回复
如果有两个第二名,或者多个第三名的时候,无法取出第四名的记录。 但一般的排名是如果第一名并列,则没有第二名,直接是第三名了。

第一,第一,第三,第四。
xieganlin 2012-02-20
  • 打赏
  • 举报
回复
楼上的方法我试了。似乎存在并列名次的记录时。不能取出前四名所有学生的记录。
ACMAIN_CHM 2012-02-20
  • 打赏
  • 举报
回复
select top 4 * from (
select X,count(*) as cnt from (
select 第一票 as X from 数据库表
union all
select 第二票 from 数据库表
union all
select 第三票 from 数据库表
union all
select 第四票 from 数据库表
) group by X
) t order by cnt desc
wwwwb 2012-02-20
  • 打赏
  • 举报
回复
ID AA
1 2
2 3
3 4
4 5
5 1
6 3
7 5
8 6
9 5
10 6
11 12
12 43
13 3
14 2
15 4
16 5
17 1
18 3
19 54
20 6
21 3
22 5
23 2
24 4
25 3
26 6
27 8
28 4

SELECT TOP 5 * FROM (
SELECT AA,COUNT(*) AS PM FROM TG
GROUP BY AA) ORDER BY PM DESC
xieganlin 2012-02-20
  • 打赏
  • 举报
回复
就是统计所有记录中,各各学号得到的票数排名。
wwwwb 2012-02-20
  • 打赏
  • 举报
回复
是1条记录中的内容?还是7条?
xieganlin 2012-02-20
  • 打赏
  • 举报
回复
数据如下:
2,3,4,5
1,3,5,6
5,6,12,43
3,2,4,5
1,3,54,6
3,5,2,4
3,6,8,4


上面的数字代表学生学号

我现在要取的结果如下(取前四名):
学号 得票数
3,6
5,5
4,4
6,4
2,3
wwwwb 2012-02-20
  • 打赏
  • 举报
回复
贴记录及要求结果出来看看

7,714

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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