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:分组函数的嵌套到底该怎么使用?
请各位高手帮我指导一下,折腾好久了。谢谢!
你又sum 又分组,还写在一个里面,何必了,你就不能先分组,再MAX,如果你说效率不好,那当我米说
嗯,你说的是。但是现在我这边有这样的需求,现在需要只写一条SQL语句完成这个查询目标。
@晴心: 是一条啊,不考虑优化写个如下:
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)
我一开始也以为第二句是对的,唉。
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
十分感谢您的回答,也很认可您的答案,实际上刚开始时我也想到了先排序再选取的方法,但是销售额最高的有可能不只一个。由于我是要在项目中有这个需求,排序后再判断而且不确定有多少条第一就显得不太方便,因此还是想求助一下各位高手有没有直接查询出的办法。
@晴心: 你的意思是
A001 350000
A002 350000
这种情况你要直接说明啊。
这个就无关程序了,并列第一,可以只取其中一个的。如果你非要取出所有并列第一的。
一般情况下,正常公司的销售,这种情况几乎不可能出现。
如果是硬要考虑这种情况,也是有解决方案的。
不好意思,我想说,你问问题的方式有问题。
这不是QQ,你最好能一次性将问题说出来。
@爱编程的大叔: 嗯,您说的是。看来问问题还是有很多技巧啊。是有可能有多个并列第一的,并且最好一次能够查出所有并列第一的
@晴心: 如果数据集是可以确定少数的话,所有性能问题都不是问题了。
土一点的办法是,
Select top 10(或是20,50),然后对数据进行循环,发现不同,马上停止。
将找到的数据放到LIST里面去。这样一般就行了。
@爱编程的大叔: 嗯,这样也算是个方法。
你写的第二句from后面在加个表别名 就好了
不可以。加不加表别名并没什么影响的
你确定?我说的是group前面,不加是语法错误啊
@不忘初心: 没有语法错误的。别名只是为了使用方便,加不加完全不影响啊
其实这个问题,不难。别想着一步昨晚,如果你先做个视图的话,问题就很清晰了……
加群交流 130017551