首页 新闻 会员 周边 捐助

SQL语句 报错:不是单组分组函数

0
悬赏园豆:20 [已解决问题] 解决于 2015-01-08 20:56

oracle数据库现在我有一个表是这样的:

销售表(Sale)

字段名

字段类型

长度

主/外键

字段值约束

对应中文名

SaleID

Varchar

10

P

Not null

销售编号

MerChID

Varchar

10

F

Not null

商品编号

SaleDate

Datetime

8

 

Not null

销售日期

SaleNum

Int

4

 

Not null

销售数量

SalePrice

Money

4

 

Not null

销售单额(销售价格)

我要查出卖得最多的商品的商品编号。即先用sum函数求出同一个SaleID的销售总量;再在此基础上用max函数求出最大的销售总量。

现在写了两个SQL语句,都不对。第一个SQL报错不是单组分组函数;第二个SQL是把所有的都查出来了,而不是只查出来销售量最大的。

1、select MerChID,max(sum(SaleNum)) from SCOTT.Sale group by MerChID

2、select MerChID,max(sumSaleNum) from (select MerChID,sum(SaleNum) sumSaleNum from SCOTT.Sale group by MerChID) group by MerChID;

说明:销售量最大的有可能存在并列多个的情况,最好能一个SQL语句查出来。

ps:分组函数的嵌套到底该怎么使用?

请各位高手帮我指导一下,折腾好久了。谢谢!

晴心的主页 晴心 | 初学一级 | 园豆:137
提问于:2014-12-11 10:21
< >
分享
最佳答案
1

你又sum 又分组,还写在一个里面,何必了,你就不能先分组,再MAX,如果你说效率不好,那当我米说

收获园豆:12
风醉 | 小虾三级 |园豆:1197 | 2014-12-11 10:26

嗯,你说的是。但是现在我这边有这样的需求,现在需要只写一条SQL语句完成这个查询目标。

晴心 | 园豆:137 (初学一级) | 2014-12-11 10:29

@晴心: 是一条啊,不考虑优化写个如下:

 select * from

(select MerChID,sum(SaleNum) as sum_Sale from SCOTT.Sale group by MerChID) A where A.sum_Sale in

(select  Max(sum_Sale) from (

select MerChID,sum(SaleNum) as sum_Sale from SCOTT.Sale group by MerChID ) A)

风醉 | 园豆:1197 (小虾三级) | 2014-12-11 13:22
其他回答(3)
1

我一开始也以为第二句是对的,唉。

1、select MerChID,sum(SaleNum) sumSaleNum from SCOTT.Sale group by MerChID

这样以后,每个商品只会出现一行了,后面是商品销售总量。

2、select MerChID,max(sumSaleNum) from (select MerChID,sum(SaleNum) sumSaleNum from SCOTT.Sale group by MerChID) group by MerChID

这就是有病了,不过按道理也应该可以执行才对。

 

如果你只要一个销售量最高的商品

只要这样就行了

Select top 1 from  (select MerChID,sum(SaleNum) sumSaleNum from SCOTT.Sale group by MerChID)x 

order by sumSaleNum desc

 

如果你要按照销售额由高到低排列,则只要这样就行了。

select MerChID,sum(SaleNum) sumSaleNum from SCOTT.Sale group by MerChID

order by sum(SaleNum) desc

收获园豆:8
爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-11 10:33

十分感谢您的回答,也很认可您的答案,实际上刚开始时我也想到了先排序再选取的方法,但是销售额最高的有可能不只一个。由于我是要在项目中有这个需求,排序后再判断而且不确定有多少条第一就显得不太方便,因此还是想求助一下各位高手有没有直接查询出的办法。

支持(0) 反对(0) 晴心 | 园豆:137 (初学一级) | 2014-12-11 10:41

@晴心: 你的意思是

A001     350000

A002     350000

这种情况你要直接说明啊。

这个就无关程序了,并列第一,可以只取其中一个的。如果你非要取出所有并列第一的。

一般情况下,正常公司的销售,这种情况几乎不可能出现。

如果是硬要考虑这种情况,也是有解决方案的。

 

不好意思,我想说,你问问题的方式有问题。

这不是QQ,你最好能一次性将问题说出来。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-11 10:44

@爱编程的大叔: 嗯,您说的是。看来问问题还是有很多技巧啊。是有可能有多个并列第一的,并且最好一次能够查出所有并列第一的

支持(0) 反对(0) 晴心 | 园豆:137 (初学一级) | 2014-12-11 10:48

@晴心: 如果数据集是可以确定少数的话,所有性能问题都不是问题了。

土一点的办法是,

Select top 10(或是20,50),然后对数据进行循环,发现不同,马上停止。

将找到的数据放到LIST里面去。这样一般就行了。

支持(0) 反对(0) 爱编程的大叔 | 园豆:30844 (高人七级) | 2014-12-11 10:51

@爱编程的大叔: 嗯,这样也算是个方法。

支持(0) 反对(0) 晴心 | 园豆:137 (初学一级) | 2014-12-11 10:55
0

你写的第二句from后面在加个表别名 就好了

隔壁老王来了 | 园豆:99 (初学一级) | 2014-12-11 10:47

不可以。加不加表别名并没什么影响的

支持(0) 反对(0) 晴心 | 园豆:137 (初学一级) | 2014-12-11 10:57

你确定?我说的是group前面,不加是语法错误啊

支持(0) 反对(0) 隔壁老王来了 | 园豆:99 (初学一级) | 2014-12-11 11:05

@不忘初心: 没有语法错误的。别名只是为了使用方便,加不加完全不影响啊

支持(1) 反对(0) 晴心 | 园豆:137 (初学一级) | 2014-12-11 11:08
0

其实这个问题,不难。别想着一步昨晚,如果你先做个视图的话,问题就很清晰了……

加群交流 130017551

iisp | 园豆:81 (初学一级) | 2014-12-12 17:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册