sql多条件分组查询,求sql语句。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql多条件分组查询,求sql语句。相关的知识,希望对你有一定的参考价值。

有表tabel

name date
1 a 2012-01-30
2 a 2012-01-17
3 b 2012-01-17
4 c 2012-01-20
5 d 2012-01-29
6 a 2012-01-01
7 c 2012-01-14

查询得到以下分组排序,按name分组,并且组与组之间按date排序。

name date
1 a 2012-01-30
2 a 2012-01-17
3 a 2012-01-01
4 d 2012-01-29
5 c 2012-01-20
6 c 2012-01-14
7 b 2012-01-17

sql多条件分组查询举例:
比如有两张表:
表一:
姓名 分数
——————
李一 2
李二 1
李三 1
张一 3
张二 2
张三 2
……

表二:


——



要查询表二中的姓的数据对表一进行分组,然后将分数统计出来。

sql语句写法如下:
SELECT
b. NAME,
sum(a.score) AS 分数
FROM
tb1 a
LEFT JOIN tb2 b ON SUBSTR(a.name FROM 1 FOR 1)= b.`name`
GROUP BY
b. NAME;

这个是mysql的写法 Oracle把SubStr函数改一下就可以了。
参考技术A select t.*
from (select a.name, a.date
from testU a
group by a.name, a.num
order by a.name, a.num desc) t
left join
(select name, max(date) date from testU group by name
) b on t.name = b.name
order by b.date desc, t.datedesc;

弄了半天才出来,试了可以,望采纳!本回答被提问者和网友采纳
参考技术B

分组是用来聚集汇总的,如求平均、求总和、求最大等
你这个不需要分组,直接排序就可以了

select name, date from table order by name asc, date desc

 如果每组要按date的降序排列,也挺简单

with t1 as (select name, max(date) md from table group by name,

t2 as (select table.name name, table.date date, t1.md from table join t1 on table.name=t1.name

order by t1.md)

select name,date from t2

参考技术C 楼主,标准的SQL如下:
select name,date from table group by name,date;

请采纳!追问

group by 之后就不是原来的数据量了 只有a b c d4列了。我并不是要合并,而是分组。

追答

不是的,完整的记录数,你执行下就知道了!!!!

 更为完善的SQL:

select name,dddd from ttt group by name,dddd order by name,dddd desc;

执行前记录:

 

执行后记录:

这下清楚了吧!

有问题欢迎提问,满意请采纳!

追问

以你的数据为例的话,结果第二组应该是d 2012-01-29 因为他仅比a组的最大值小。

追答

如果像这样说的话,则不能以name分组了。
肯定是组内时间排序的,如果组与组时间排序,那还能name分组吗?服你。
还有,我的数据就是你题目的数据。
你自己看看你的题目吧,乱了。

追问

我的问题没有错的,结果前三列 a 算是以name为标识一组 (最大日期是2012-01-30),第4列是 d 算是第二个以name为标识的组(最大日期是2012-01-29) 用这两个组内的最大date来排序。

参考技术D select name , date from tabel order by name , date追问

试过,不好用。这种查询的结果是优先name 虽然name在一起,但是顺序也是按name来排的

追答

你的意思是name不用排序是吧 那就会有点麻烦

追问

name 一样的在一起就可以 但他不是排序条件。类似把name一样的绑到一个组里,在组与组之间用date排序显示在一个表里。求代码或思路。

追答

分组group by 之后 select后面就只能跟组标识和组函数
如果要按name分组那就查找不到date
要是非要分出一个组的话,我是这么想的:
先分组
select name from table group by name
得到各个组名 name
在外面for循环取出每个组的每条数据
如果你要想一条SQL语句得到 那就要想想办法了 我再看看
select name ,date from table group by name date order by date desc这个语句应该是可以了 刚刚看到的别人的回复 我就是想试试这条语句呢 你可以试试

追问

select name ,date from Table_1 group by name,date order by date desc ??
这个得到的结果是只是按date排了序,name都是乱的。

追答

select * from (
select name ,date from Table order by date desc
) group by name,date
试试这个。。。

追问

select * from (select TOP (100) PERCENT name ,date from Table order by date desc) as a group by a.name,a.date

得到的还是a,b,c,d的排序,没有按时间。

追答

因为你的数据刚开始就是a b c d 排列的 你试试把数据前面的顺序换换试试

08章 分组查询子查询原生SQL

一、分组查询

使用group by关键字对数据分组,使用having关键字对分组数据设定约束条件,从而完成对数据分组和统计

1.1 聚合函数:常被用来实现数据统计功能

① count() 统计记录条数

② sum() 求和

③ min() 求最小值

④ max() 求最大值

⑤ avg() 求平均值

例子:查询所有员工的平均工号

注:select语句查询出来只有一个值,因此不能用list(),list投影出来的是一个集合。在这里提供uniqueResult()方法

     /*
     * 分组查询  所有员工的平均工号   
     */
    
    @Test
    public void avgTest(){
        Query query=session.createQuery("select avg(empId) from Emp");
        Object count=query.uniqueResult();
        System.out.println(count);
    }

输出结果:

 


 

二、子查询

子查询语句应用于HQL查询语句的where子句中。

子查询关键字:

all:子查询语句返回的所有记录

any:子查询语句返回的任意一条记录

some:和“any”意思相同

in:与“=any”意思相同

exists:子查询语句至少返回一条记录


 

例子:查询所有员工工资都小于2000的部门

     /*
     * 子查询   查询所有员工工资都小于2000的部门
     */
    
    @Test
    public void childTest(){
        List<Dept> list=session.createQuery("from Dept d where 2000>all(select e.sal from d.emps e) and d.emps.size>0").list();
        for (Dept dept : list) {
            System.out.println(dept.getDeptName());
        }
    }

输出结果:

 


 

 

三、原生SQL查询和命名查询

注:对于原生SQL查询方式,使用Session的createSQLQuery()方法来创建SQLQuery对象,createSQLQuery()方法的参数是底层数据库的sql语句,SQLQuery接口继承了Query接口。该语句不能返回强类型的Dept对象,需使用addEntity()封装到一个Dept实体类

例子:查询部门名称

     /*
     * 原生sql
     */
    
    @Test
    public void sqlTest(){
        SQLQuery query=session.createSQLQuery("select * from dept1").addEntity(Dept.class);
        List<Dept> list=query.list();
        for (Dept dept : list) {
            System.out.println(dept.getDeptName());
        }
    }
    

输出结果:


 

命名查询:在映射文件中定义字符串形式的查询语句

将SQL语句配置到一个文件

如图所示:

以上是关于sql多条件分组查询,求sql语句。的主要内容,如果未能解决你的问题,请参考以下文章

08章 分组查询子查询原生SQL

sql 分组排序

mysql 分组子查询sql怎么写

SQL语句的补充

sql子查询可以再分组吗

SQL学习笔记 ----Mysql数据库的条件查询