首页 > 解决方案 > 我的查询有问题。一旦我在 group by 之前添加了一个附加项,它就会说我有一个 group by 错误

问题描述

样本数据:

+ -----+------+--------+------+------+---------+--- ---------+--------+
| 夹子 | 客户 | 符号 | 边 | 数量 | 填充数量 | 填充像素 | 执行 |
+ -----+------+--------+------+------+---------+--- ---------+--------+
| 274 | C2 | 国际贸易中心 | 出售 | 2000 | 167 | 12.09 | 1 |
| 188 | C9 | SBS | 出售 | 2000 | 121 | 38.599998 | 2 |
| 155 | C1 | C | 出售 | 1500 | 159 | 50.650002 | 3 |
| 294 | C5 | BMY | 购买 | 2000 | 第667章 13.648224 | 4 |
| 276 | C7 | FCX | 购买 | 2000 | 91 | 26.59 | 5 |
| 255 | C9 | FCX | 出售 | 2000 | 231 | 26.389999 | 6 |
| 276 | C7 | FCX | 购买 | 2000 | 182 | 30 | 7 |
| 277 | C1 | BMY | 购买 | 2000 | 第1333章 11.61 | 8 |
| 188 | C9 | SBS | 出售 | 2000 | 91 | 40.860001 | 9 |
| 133 | C5 | BMY | 出售 | 5000 | 第636章 12.721739 | 10 |
| 110 | C7 | 机管局 | 购买 | 5000 | 182 | 8.359823 | 11 |
| 120 | C7 | IBM | 购买 | 5000 | 111 | 72.419998 | 12 |
| 152 | C2 | 文学士 | 购买 | 1500 | 167 | 142.690002 | 13 |
| 276 | C7 | FCX | 购买 | 2000 | 273 | 28.25 | 14 |
+ -----+------+--------+------+------+---------+--- ---------+--------+
客户方符号数量 clid
C5 出售 F 2000 257
C6 购买亚马逊 1500 203
C7 购买 IBM 5000 120
C6 买 F 5000 228
C1 购买 UNH 5000 172
C1 卖出 FCX 2000 242
C8买F 2000 186
C5 买 BMY 2000 294
C1 卖出 SBS 2000 212
C9 卖出 SBS 2000 194
C6 卖 FB 1500 232
C3 出售亚马逊 2000 113
C9 购买 BAC 5000 102
C8 购买 BMY 5000 227
C9 卖 FB 5000 296
C2 出售 INTC 2000 274
C6 卖 C 2000 171

客户将提交购买 X 股的买入订单,数量为已处理的部分订单。我想要做的是找到已完成订单的数量和订单的平均价格。

这有效:

select clid, oQty, sum(fillqty) 
from 
(select clid, side, oQty, fillqty, fillpx, execid 
from fills where side='buy' group by clid, fillqty) A 
group by clid;

这不起作用:

select clid, oQty, sum(fillqty) 
from 
(select clid, side, oQty, fillqty, fillpx, execid from fills where side='buy' group by clid, fillqty) A 
where oQty = sum(fillqty) 
group by clid;

ERROR 1111 (HY000): 组函数使用无效

我不明白为什么我不能在 group by 之前添加比较...有人可以解释为什么会出现错误吗?

标签: mysqlsqlgroup-by

解决方案


您不能使用聚合函数,例如SUM在您的情况下,inWHERE子句。使用HAVING.

在语句中创建一个别名并在子句中SELECT使用它。HAVING这是一种更优化的方式,因为它避免了再次计算总和。

select clid, oQty, sum(fillqty) AS SumQty
from 
(select clid, side, oQty, fillqty, fillpx, execid 
from fills where side='buy' group by clid, fillqty) A 
group by clid
having SumQty = oQty;

推荐阅读