分组后分组合计以及总计SQL语句

您所在的位置:网站首页 sql分组求和带明细 分组后分组合计以及总计SQL语句

分组后分组合计以及总计SQL语句

2023-09-10 02:57| 来源: 网络整理| 查看: 265



分组后分组合计以及总计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表

查询结果:

http://files.jb51.net/file_images/article/201207/2012072710445432.jpg

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

执行结果图:

http://files.jb51.net/file_images/article/201207/2012072710445433.jpg

可以看到是按照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

执行结果图:

http://files.jb51.net/file_images/article/201207/2012072710445434.jpg

例子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