分组后分组合计以及总计SQL语句 |
您所在的位置:网站首页 › sql分组求和带明细 › 分组后分组合计以及总计SQL语句 |
分组后分组合计以及总计SQL语句
1)想一次性得到分组合计以及总计,sql: SELECT 分组字段 FROM 表 GROUP BY 分组字段 compute sum(COUNT(*))
===== 2)分组合计1: SELECT COUNT(*) FROM (SELECT 分组字段 FROM 表 GROUP BY 分组字段 )别名
3)分组合计2: SELECT COUNT(*) FROM (SELECT distinct 分组字段 FROM 表)别名 4)统计分组后的种类数:
例子1:分组合计 SELECT JSSKQK_JGH FROM SJ_JSSKQK WHERE JSSKQK_JGH IN (SELECT JSJBXX_JGH FROM SJ_JSJBXX WHERE JSJBXX_JSLXM1=1) GROUP BY JSSKQK_JGH HAVING ((SUM(JSSKQK_SSKCXS1) /40)>5) 上面的语句已经可以满足要求分组了.假设执行后有3条记录,怎么才能把这个COUNT值求出? select count(*) from ( SELECT JSSKQK_JGH FROM SJ_JSSKQK WHERE JSSKQK_JGH IN (SELECT JSJBXX_JGH FROM SJ_JSJBXX WHERE JSJBXX_JSLXM1=1) GROUP BY JSSKQK_JGH HAVING ((SUM(JSSKQK_SSKCXS1) /40)>5) ) t
例子2:[PL/SQL] 如何得到分组后,组中最大日期的纪录 TABLE:A A B C D 1 2001/01/01 1 1 1 2001/12/12 2 2 3 2002/01/01 3 3 3 2003/12/12 4 4 按列A分组,请问如何得到每组中时间最大的数据? 1 2001/12/12 2 2 3 2003/12/12 4 4 我的笨方法: SELECT * FROM A WHERE (A,B) IN( SELECT A,MAX(B) FROM A GROUP BY A ) 有更好的方法吗? 1,select * from a out where b = (select max(b) from a in where in.a = out.a) 2,Select * from (select a, row_number() over (partition by a order by b desc) rn from a) where rn=1 3,Select a, b,c,d from (select a, b,c,d,row_number() over (partition by a order by b desc) rn from a) where rn=1 4,select A,B,C,D from test where rowid in ( select rd from ( select rowid rd ,rank() over(partion A order by B desc)rk from test ) where rk=1 ) ) 例子3:SQL语句分组获取记录的第一条数据的方法使用Northwind 数据库 首先查询Employees表 查询结果: city列里面只有5个城市 使用ROW_NUMBER() OVER(PARTITION BY COL1 ORDER BY COL2) 先进行分组 注:根据COL1分组,在分组内部根据 COL2排序,而此函数计算的值就表示每组内部排序后的顺序编号(组内连续的唯一的). sql语句为: select EmployeeID,LastName,FirstName,Title,TitleOfCourtesy,City,ROW_NUMBER() over(partition by City order by EmployeeID) as new_index from Employees 执行结果图: 可以看到是按照City分组,EmployeeID排序。 select出分组中的第一条记录 执行语句: select * from (select EmployeeID,LastName,FirstName,Title,TitleOfCourtesy,City,ROW_NUMBER() over(partition by City order by EmployeeID) as new_index from Employees) a where a.new_index=1 执行结果图: 例子4:sql 获取分组结果后,如何每一组的第一条记录Eric red 20 eric blue 30 andy red 10 andy blue 5 例如,只获取黑体的记录。 1,declare @fTable table (fName varchar(10), fColor varchar(10), fOrder int) insert into @fTable values('Eric', 'red', 20) insert into @fTable values('eric', 'blue', 30) insert into @fTable values('andy', 'red', 10) insert into @fTable values('andy', 'blue', 5) -- 只获取红色 select * from @fTable where fColor = 'red' -- 每个 fColor 取一条记录(按 fOrder 正序) select * from @fTable A where fName = (select top 1 fName from @fTable where fColor = A.fColor order by fOrder ) -- 每个 fColor 取一条记录(按 fOrder 反序) select * from @fTable A where fName = (select top 1 fName from @fTable where fColor = A.fColor order by fOrder desc)
2,SQL2005以上版本 select * from (select *,row=row_number()over(partition by Color order by Color) from table1)t where row=1 and color='xx'--加上條件 SQL2000用 top 1 例子5:一条SQL语句搞定分组并且每组限定记录集的数量
如果我想得到这样一个结果集:分组,并且每组限定记录集的数量,用一条SQL语句能办到吗?
比如说,我想找出学生期末考试中,每科的前3名,只用一条SQL语句,该怎么写?
表[TScore]的结构 code 学号 char subject 科目 int score 成绩 int
可以这样写:
SELECT [code] ,[subject] ,[score] FROM ( SELECT * ,RANK() OVER(PARTITION BY subject ORDER BY score DESC) AS Row FROM TScore ) AS a WHERE Row 500 AND salary 600 AND salary 800 AND salary 500 AND salary 600 AND salary 800 AND salary =2
HAVING子句与WHERE子句的区别
HAVING子句和WHERE子句的相似之处在于,它也定义搜索条件。但与WHERE子句不同,HAVING子句与组有关,而不是与单个的行有关。
1、如果指定了GROUP BY子句,那么HAVING子句定义的搜索条件将作用于这个GROUP BY子句创建的那些组。
2、如果指定WHERE子句,而没有指定GROUP BY子句,那么HAVING子句定义的搜索条件将作用于WHERE子句的输出,并把这个输出看作是一个组。
3、如果既没有指定GROUP BY子句也没有指定WHERE子句,那么HAVING子句定义的搜索条件将作用于FROM子句的输出,并把这个输出看作是一个组。
4、在SELECT语句中,WHERE和HAVING子句的执行顺序不同。在本书的5.1.2节介绍的SELECT语句的执行步骤可知,WHERE子句只能接收来自FROM子句的输入,而HAVING子句则可以接收来自GROUP BY子句、WHERE子句和FROM子句的输入。
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |