mysql - 我的查询有问题。一旦我在 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 之前添加比较...有人可以解释为什么会出现错误吗?
解决方案
您不能使用聚合函数,例如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;