У меня проблемы с моим запросом. Как только я добавляю дополнение, где перед группой указано, что у меня есть группа по ошибке - PullRequest
0 голосов
/ 30 октября 2018

Пример данных:

+ -----+------+--------+------+------+---------+------------+--------+
| clid | cust | symbol | side | oQty | fillQty | fillPx     | execid |
+ -----+------+--------+------+------+---------+------------+--------+
| 274  | C2   | INTC   | SELL | 2000 | 167     | 12.09      | 1      |
| 188  | C9   | SBS    | SELL | 2000 | 121     | 38.599998  | 2      |
| 155  | C1   | C      | SELL | 1500 | 159     | 50.650002  | 3      |
| 294  | C5   | BMY    | BUY  | 2000 | 667     | 13.648224  | 4      |
| 276  | C7   | FCX    | BUY  | 2000 | 91      | 26.59      | 5      |
| 255  | C9   | FCX    | SELL | 2000 | 231     | 26.389999  | 6      |
| 276  | C7   | FCX    | BUY  | 2000 | 182     | 30         | 7      |
| 277  | C1   | BMY    | BUY  | 2000 | 1333    | 11.61      | 8      |
| 188  | C9   | SBS    | SELL | 2000 | 91      | 40.860001  | 9      |
| 133  | C5   | BMY    | SELL | 5000 | 636     | 12.721739  | 10     |
| 110  | C7   | AA     | BUY  | 5000 | 182     | 8.359823   | 11     |
| 120  | C7   | IBM    | BUY  | 5000 | 111     | 72.419998  | 12     |
| 152  | C2   | BA     | BUY  | 1500 | 167     | 142.690002 | 13     |
| 276  | C7   | FCX    | BUY  | 2000 | 273     | 28.25      | 14     |
+ -----+------+--------+------+------+---------+------------+--------+
cust    side    symbol  qty clid
C5  SELL    F   2000    257
C6  BUY AMZN    1500    203
C7  BUY IBM 5000    120
C6  BUY F   5000    228
C1  BUY UNH 5000    172
C1  SELL    FCX 2000    242
C8  BUY F   2000    186
C5  BUY BMY 2000    294
C1  SELL    SBS 2000    212
C9  SELL    SBS 2000    194
C6  SELL    FB  1500    232
C3  SELL    AMZN    2000    113
C9  BUY BAC 5000    102
C8  BUY BMY 5000    227
C9  SELL    FB  5000    296
C2  SELL    INTC    2000    274
C6  SELL    C   2000    171

Клиент подаст заявку на покупку акций X, и oqty - это обработанный частичный заказ. То, что я хочу сделать, это найти количество выполненных заказов и среднюю цену заказа.

Это работает:

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;

ОШИБКА 1111 (HY000): недопустимое использование групповой функции

Я не понимаю, почему я не могу добавить сравнение прямо перед группой ... Может кто-нибудь объяснить, почему произошла ошибка?

Ответы [ 4 ]

0 голосов
/ 30 октября 2018

Учитывая, что clid, cust, side и oqty одинаковы для каждой частичной заливки, которую вы можете обойтись без подзапроса, и просто используйте max или min, чтобы получить отдельный oqty, используя group by и предложение has для проверки, например

 select clid,group_concat(side),group_concat(oqty),min(oqty),max(oqty) maxoqty,sum(fillqty) sumfill,count(*), 
                sum(fillpx),avg(fillpx)
from fills
where side = 'buy'
group by clid having maxoqty <> sumfill;

Заметьте, я добавил некоторые другие агрегаты для удовольствия.

+------+--------------------+--------------------+-----------+---------+---------+----------+-------------+-------------+
| clid | group_concat(side) | group_concat(oqty) | min(oqty) | maxoqty | sumfill | count(*) | sum(fillpx) | avg(fillpx) |
+------+--------------------+--------------------+-----------+---------+---------+----------+-------------+-------------+
|  110 | BUY                | 5000               |      5000 |    5000 |     182 |        1 |        8.36 |    8.360000 |
|  120 | BUY                | 5000               |      5000 |    5000 |     111 |        1 |       72.42 |   72.420000 |
|  152 | BUY                | 1500               |      1500 |    1500 |     167 |        1 |      142.69 |  142.690000 |
|  276 | BUY,BUY,BUY        | 2000,2000,2000     |      2000 |    2000 |     546 |        3 |       84.84 |   28.280000 |
|  277 | BUY                | 2000               |      2000 |    2000 |    1333 |        1 |       11.61 |   11.610000 |
|  294 | BUY                | 2000               |      2000 |    2000 |     667 |        1 |       13.65 |   13.650000 |
+------+--------------------+--------------------+-----------+---------+---------+----------+-------------+-------------+
6 rows in set (0.00 sec)
0 голосов
/ 30 октября 2018

Вы не можете использовать агрегатные функции, такие как SUM в вашем случае, в предложении WHERE. Используйте 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;
0 голосов
/ 30 октября 2018

Поскольку вы сравниваете агрегатную функцию в сравнении, таким образом, вы должны использовать HAVING вместо WHERE:

select clid, oQty, sum(fillqty) 
from 
(select clid, side, oQty, fillqty, fillpx, execid from fills where side='buy' group by clid, fillqty) A 
having  sum(fillqty) = oQty 
group by clid;
0 голосов
/ 30 октября 2018

Теперь должно

    Select * 
    From
    (select clid, oQty, sum(fillqty) as SUM 
    from 
    (select clid, side, oQty, fillqty, fillpx, execid 
    from fills where side='buy' group by clid, fillqty) A 
    group by clid)B
    where B.SUM=B.oQty;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...