Ⅰ sql分组统计后分别显示前几条记录
首先,该问题对应的SQL如下
select 采购类别,客户,订货总额
from (select采购类别,客户,订货总额,
row_number() over(partition by 采购类别 order by 订货总额 desc) rn
from table_name) a
where rn<=2
;
其次,常用数据库比如Oracle和Sqlserver都有特定函数完成分组排序的功能,如果需要显示并列的情况可以用下面另外的2个.
分别有3个类似函数:
row_number() over
这个函数不需要考虑是否并列,哪怕根据条件查询出来的数值相同也会进行连续排名。也是最常用的函数,排序结果类似于1,2,3,4,5
rank() over
查出指定条件后进行一个排名,但是有一个特点。假如是对学生排名,那么实用这个函数,成绩相同的两名是并列。排序结果类似于1,2,2,4,5
dense_rank() over
比较特殊,排序结果类似于1,2,2,3,4
Ⅱ SQL语句如何取前10条,10-30条记录
常用几种数据库,取前10条记录的sql语句写法。
access:
select top (10) * from table1 where 1=1
db2:
select column from table where 1=1 fetch first 10 rows only
mysql:
select * from table1 where 1=1 limit 10
sql server:
读取前10条:select top (10) * from table1 where 1=1
读取后10条:select top (10) * from table1 order by id desc
oracle:
select * from table1 where rownum<=10
取10-30条的记录:
select top 20 * from 表名 where id not in(select top 10 id from 表名)
(2)Sql针对三个类别分别统计前十扩展阅读:
使用SQL从表中取记录。
SQL的主要功能之一是实现数据库查询。如果你熟悉Internet 引擎,那么你已经熟悉查询了。你使用查询来取得满足特定条件的信息。
多数Internet 引擎允许逻辑查询。在逻辑查询中,你可以包括特殊的运算符如AND、OR和NOT,你使用这些运算符来选择特定的记录。
如果需要扩展查询的结果,可以使用逻辑操作符OR。例如,如果执行一个搜索,搜索所有的其描述中包含Active Sever Pages OR SQL的站点,收到的列表中将包括所有其描述中同时包含两个表达式或其中任何一个表达式的站点。
如果想从搜索结果中排除特定的站点,可以使用NOT。例如,查询“Active Sever Pages ”AND NOT “SQL”将返回一个列表,列表中的站点包含Active Sever Pages,但不包含SQL。当必须排除特定的记录时,可以使用NOT。
用SQL执行的查询与用Internet搜索引擎执行的搜索非常相似。 当执行一个SQL查询时,通过使用包括逻辑运算符的查询条件,你可以得到一个记录列表。此时查询结果是来自一个或多个表。
Ⅲ sql 统计销量 前10
这样建表有很大问题 数据冗余 应该建立两个表 一个商品表 里边有 id titil price 第二张是销售表 有 商品对应的id state count(销售数量) 让卖出一个件产品 就更新count+1; 用update语句 如果按照你的表 每卖出一个就要添加一条记录 每条记录出了时间不一样 其他都一样
Ⅳ 用SQL如何统计获取结果中从多到少的前10个
例表tab_test ,数量列名:sl
select top 10 * from tab_test order by d desc
语句执行,先将结果集按 sl 的降序 排序,然后使用 top 10 选择前10行数据。
如果单一用户有多条记录,那需要将用户分组,计算数量
例表tab_test ,数量列名:sl,用户列名: user
select top 10 user,sum(sl) as 'sl_xj' from tab_test group by user order by sl_xj desc
Ⅳ SQL问题,分类统计
一个通用的针对单表用的交叉表存储过程
传入几个参数:
@TableName varchar(16) --表名
@纵轴 varchar(20) --交叉表最左面的列
@横轴 varchar(10) --交叉表最上面的列
@表体内容 numeric(10,2) --交叉表的数字内容
@是否加横向合计 bit --为1时在交叉表横向最右边加横向合计
@是否家纵向合计 bit --为1时在交叉表纵向最下边加纵向合计
思路:
1、取得disinct 横轴字段 后,取得唯一的横轴字段表
2、根据横轴的唯一字段内容,循环整个表后动态生成一个Sql语句,
像select 科室,sum(case(横轴字段表.....).......) from @tablename group
by 科室
exec 生成的Sql
3、根据参数是否合计,分别加合计字段,求出横向合计和纵向合计
您看这个思路行吗?但有一个限制就是横轴不能太多,多了Sql可能会超过8000字符。一般不会这么多,如果太多就把横轴变为纵轴,总之取字段较少的做横轴,这个就是传参数时的问题了。
如果弄成了,这个在一定的范围内应该是比较通用的了。对不!
这是我的思路,具体写的时候,感觉到Sql的组合比较麻烦,能帮我写一下吗?
============================================================
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_qry]') and OBJECTPROPERTY(id, N'IsProcere') = 1)
drop procere [dbo].[p_qry]
GO
/*--生成交叉表的简单通用存储过程
根据指定的表名,纵横字段,统计字段,自动生成交叉表
并可根据需要生成纵横两个方向的合计
注意,横向字段数目如果大于纵向字段数目,将自动交换纵横字段
如果不要此功能,则去掉交换处理部分
--邹建 204.06--*/
/*--调用示例
exec p_qry 'syscolumns','id','colid','colid','name like ''s%''',1,1
--*/
create proc p_qry
@TableName sysname, --表名
@纵轴 sysname, --交叉表最左面的列
@横轴 sysname, --交叉表最上面的列
@表体内容 sysname, --交叉表的数数据字段
@条件 varchar(1000),--查询的处理条件
@是否加横向合计 bit, --为1时在交叉表横向最右边加横向合计
@是否家纵向合计 bit --为1时在交叉表纵向最下边加纵向合计
as
declare @s nvarchar(4000),@sql varchar(8000)
--规范条件
set @条件=case when @条件<>'' then ' where ('+@条件+')' else '' end
--判断横向字段是否大于纵向字段数目,如果是,则交换纵横字段
set @s='declare @a sysname
if(select case when count(distinct ['+@纵轴+'])from ['+@TableName+'] '+@条件+')=1
select @a=@纵轴,@纵轴=@横轴,@横轴=@a'
exec sp_executesql @s
,N'@纵轴 sysname out,@横轴 sysname out'
,@纵轴 out,@横轴 out
--生成交叉表处理语句
set @s='
set @s=''''
select @s=@s+'',[''+cast(['+@横轴+'] as varchar)+'']=sum(case ['+@横轴
+'] when ''''''+cast(['+@横轴+'] as varchar)+'''''' then ['+@表体内容+'] else 0 end)''
from ['+@TableName+']
'+@条件+'
group by ['+@横轴+']'
exec sp_executesql @s
,N'@s varchar(8000) out'
,@sql out
--是否生成合计字段的处理
declare @sum1 varchar(200),@sum2 varchar(200),@sum3 varchar(200)
select @sum1=case @是否加横向合计
when 1 then ',[合计]=sum(['+@表体内容+'])'
else '' end
,@sum2=case @是否家纵向合计
when 1 then '['+@纵轴+']=case grouping(['
+@纵轴+']) when 1 then ''合计'' else cast(['
+@纵轴+'] as varchar) end'
else '['+@纵轴+']' end
,@sum3=case @是否家纵向合计
when 1 then ' with rollup'
else '' end
--生成交叉表
exec('select '+@sum2+@sql+@sum1+'
from ['+@TableName+']
'+@条件+'
group by ['+@纵轴+']'+@sum3)
go
exec p_qry 'test','name','subject','source','source>70',0,0
Ⅵ sql 查询每个班前十名
表建的很不合理啊
首先,班级要一张表
学生信息要一张表
成绩一张表
建数据库要有遵守三条原则啊,不然也很不方便查询
你这题,用分组也没办查. 楼上两位完全就是骗分的...没一个正确的
就说一楼的这句SELECT TOP 10 * FROM 表名 WHERE 条件 ORDER BY 成绩 DESC ...请问条件是什么?
再说二楼的selet top 10 * from 学生表 order by 成绩 desc
你这查出来的只是所有班所有前十名的成绩.而不是每个班的前十名
如果表只有一张,只能分班查...比如班级列叫calss,其中有一个班级Classone
select top 10 * from 表名 where class='Classone' order by 成绩
Ⅶ SQL 前几个的统计统计
select top 10 sum(列) from 表
select top 20 sum(列) from 表
select top 30 sum(列) from 表
top 后面的数字代表只取前多少行 sum就是加
Ⅷ SQL统计出所有科目总分最高的前10位
你好, 很高兴为你解答
因为不太清楚你的科目与总分是在一个表中, 还是两个, 如果假设是一个的化
表中有科目 和总分, 那样科目的ID因该是主键
select top 10 科目,总分 from 科目表 order by 总分 desc
希望有所帮助
Ⅸ SQL 分类统计
select a.nums,a.groups from
(
select count(aa) as Nums,'0~10' as Groups from table_cc where aa between 0 and 10
union
select count(aa) as Nums,'10~20' as Groups from table_cc where aa between 10 and 20
union
select count(aa) as Nums,'20~30' as Groups from table_cc where aa between 20 and 30
)a
说明:你是不是想得到这样的结果
Ⅹ 问一下SQL分类汇总并排行的问题
num1后面多了个逗号
order by num1 desc 换成 order by a desc 试试