求oracle数据库大神,

如图,我知道用了group by要用聚合函数才能不报错,但是我这里有多个字段需要显示,求大神解答一下,或者不用group by 查询只要实现按zllb统计 查出结果就可以了(需求是要按zllb查出结果并显示多个字段)

既然是统计 其它字段 就应该是统计的数据 应该是MAX(hj) 而不是直接是hj , a.gxsj, a.jssj 这样的才行啊
g.hj ,a.gxsj, a.jssj
修改 max(g.hj),max(a.gxsj),max(a.jssj )追问

max我试过了,每次只能现实最多那条数据,其他不显示

追答

那你要统计什么啊
如果说你要分组显示全部的话 就不用group by 而是用排序 order by zllb 了

追问

不是排序啊

是按zllb这个类统计啊

追答

我知道啊 你要统计什么啊 统计这个 有多少条 还是统计什么? 你的COUNT(*) 表示统计多少条 这个就很好理解
g.hj ,a.gxsj, a.jssj 这些你又是统计什么? 要知道 zllb 现在代表的不是一条数据 而是一群 你一群怎么去对应一条的字段?

我看你 下面兄台回答说 去掉重复就可以 你直接加个 distinct 就可以去除重复

追问

这个也有点道理额

不过我现在已经乱了

追答

你需求都不明确啊 你都不知道统计什么。。。

追问

就是根据zllb查出这几个字段啊

怎么不明确啊

追答

假如 有 zllb 有3条叫 A 2条是B
如果你是要统计 A 有多少条 B有多少条
select zllb,count(*) group by zllb 那么这个时候 gxsj 这个字段 数据 到底是显示 第一条 还是显示第二条 根本没办法确定 只能是MAX 这样选唯一条

追问

这也可以,但是还有一个hj字段不行

温馨提示:答案为网友推荐,仅供参考
第1个回答  2016-08-30
select b.zlib, b.zs, g.hj, a.gxsj, a.jssj
from slsq a,
(select a.zlib,count(*) as zs
from slsq a
where a.zlib is not null
group by a.zlib) b,
(select to_char(k.name_) hj, p.business_key_
from gisqbpm.ACT_BIZ_PROCINST p,
gisqbpm.ACT_RU_TASK k
where p.proc_inst_id_ = k.proc_inst_id_) g
where a.zlib = b.zlib
and a.ywh = g.business_key_;追问

哥们儿,这个zllb有重复的啊,不能重复的,如果这个问题解决了应该可以的

追答

a.gxsj, a.jssj
这两个字段不在分组中,所以检索结果出现了分组的项目有重复。
如果不重复的话这两个字段要取第几个记录?
因为分组后的记录里同一个组的记录只有一条,所以想问一下对于没在分组单位里的字段,要取第几个记录?

追问

这两个是时间,一个开始时间,一个结束时间

第一个去最开始的时间,第二个取最后一个吧

追答

select a.zlib, count(*) zs, g.hj, min(a.gxsj), max(b.jssj)
就是你写的那个SQL,把第一行像这样再加一个集函数,你再试一试。
是你原来写的那个SQL上这样改。

追问

这样那个g.hj多了,去掉就可以,但是不能去掉啊

怎么办?

追答

我想再问个问题,slsq表中ywh和zlib这两个字段的关系是什么?

追问

一个是文件的编号,一个是文件的类别

追答

select b.zlib, b.zs, g.hj, b.gxsj, b.jssj
from
(select a.zlib,count(*) as zs,min(a.gxsj), max(a.jssj)
from slsq a
where a.zlib is not null
group by a.zlib) b,
(select to_char(k.name_) hj, p.business_key_, a.zlib
from gisqbpm.ACT_BIZ_PROCINST p,
gisqbpm.ACT_RU_TASK k,
slsq a
where p.proc_inst_id_ = k.proc_inst_id_
and a.ywh = p.business_key_) g
where g.zlib = b.zlib;

这样写再试一下。

追问

还是不行啊

zllb重复了

后面红色的那几个是我注释掉的

这样才可以运行

不然报错啊

追答

ywh和zllb不是一对一的关系,可能是多对一的关系。
有些麻烦。就是现在一个文件类别中包含多个文件编号,而文件编号是与另一个检索相关联的条件。如果一个文件类别只取一个文件编号的话,这样分组做的统计就失去意义了。
麻烦你个事儿,你看一下你客户的要求,这个ACT_RU_TASK表的name_字段是必须要检索出来的吗?因为如果把这个字段加上的话对统计有影响。
如果必须要加的话,那就像之前写的那两个时间一样,把你写的SQL中的hj也加个集函数。这样做是没有办法的办法。

追问

这个字段是个字符串类型的,加个什么集函数啊?

追答

但是不加,没办法回避分组这个问题。
除非分组的时候是按照这两个字段进行分组。

追问

按两个分组应该会乱的

追答

那就还得需要确认一个问题ywh和zllb是多对一的关系。
如果检索结果中zllb取一条,那么与zllb对应的ywh应该取哪一条?就是取得的条件是什么?
拜托你帮忙找一下,谢谢。

追问

ywh和zllb是一对一的

这个ywh永远不会重复的,也只能给一个文件

如果有相同类型的文件,会有另外一个ywh

追答

如果ywh和zllb是一对一的关系的话,那么分组条件中,写这两个与只写zllb的检索结果应该是一样的。因为一个zllb只能有一个ywh与之对应。
如果现在数据库里数据关系是这样的话,那你在分组条件中写两个,试一试。

啊?!那就是说ywh和zllb是多对一的关系了?
如果是多对一的关系的话,只能是在hj上加个集函数了。

追问

那用哪个语句试?你给我的那个吗?

不行啊,多了一半多的数据了

试过了

追答

现在数据库里的数据是ywh和zllb是多对一的关系。
就是说一个文件类型会有多个文件编号,那么像这种检索只能用这种集函数的方法回避了。
就是你写的SQL上,对hj加个集函数。

追问

那用那个函数啊?

追答

MAX或者MIN。

追问

这个好像可以了

😱😱

厉害啊

本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网