MySQL HAVING дает мне другой результат

0

У меня есть следующие данные:

+--------------------+-------------+------------------+
| timestamp          | profit_loss | profit_loss_type |
+--------------------+-------------+------------------+
| lm58-1527906222477 |  0.00200000 | profit           |
| lm58-1527906222477 | -0.00008617 | fraction         |
| lm58-1527906222477 | -0.00027400 | normal           |
| lm58-1527906222477 |  0.00008617 | nett             |
| lm58-1527906222477 |  0.00027400 | nett             |

| lm99-1527906222888 |  0.00200000 | profit           |
| lm99-1527906222888 | -0.00008617 | fraction         |
| lm99-1527906222888 | -0.00027400 | normal           |

| lm11-1527906222999 |  0.00200000 | profit           |
| lm11-1527906222999 |  0.00008617 | fraction         |
| lm11-1527906222999 |  0.00027400 | normal           |

+--------------------+-------------+------------------+

и я хочу получить profit_loss < 0 timestamp WITH profit_loss < 0 но БЕЗ profit_loss_type = 'nett'

поэтому я ожидаю результата следующим образом:

+--------------------+
| timestamp          |
+--------------------+
| lm99-1527906222888 |
+--------------------+

здесь мой запрос, чтобы получить всю timestamp которая содержит profit_loss < 0:

SELECT timestamp
FROM gross_profit
WHERE profit_loss < 0
AND (profit_loss_type = 'normal' OR profit_loss_type = 'fraction')
GROUP BY timestamp

13367 rows in set (0.15 sec)

но когда я добавляю HAVING, почему результат отличается?

SELECT timestamp
FROM gross_profit
GROUP BY timestamp
HAVING SUM(CASE WHEN profit_loss_type = 'nett' THEN 1 ELSE 0 END) = 0
AND SUM(CASE WHEN profit_loss < 0 THEN 1 ELSE 0 END) = 1;

10741 rows in set (0.23 sec)

в то время как при этой симуляции у меня есть только 1 временная метка, которая содержит profit_loss_type = nett, поэтому результат должен быть 13366. не 10741.

  • 1
    Можете ли вы поделиться еще некоторыми образцами данных и правильно их уменьшить? В данном примере показаны две строки с profit_loss_type = nett , и с данными данными невозможно получить около 10 тыс. Строк результатов.
  • 0
    мои реальные данные около 60 тысяч строк. это уже уменьшено, и я попытался упростить проблему. Мне просто нужно получить profit_loss timestamp с минусом profit_loss но не содержит profit_loss_type = nett
Показать ещё 4 комментария
Теги:

1 ответ

1
Лучший ответ

Изменить на SUM> 0

SQL DEMO

SELECT timestamp
FROM gross_profit
GROUP BY timestamp
HAVING SUM(CASE WHEN profit_loss_type = 'nett' THEN 1 ELSE 0 END) = 0
AND SUM(CASE WHEN profit_loss < 0 THEN 1 ELSE 0 END) > 0;

Ещё вопросы

Сообщество Overcoder
Наверх
Меню