Предложение MySQL Having с коррелированным запросом не работает

#mysql #sql #mysql-error-1064

#mysql #sql #mysql-ошибка-1064

Вопрос:

У меня проблема в моем предложении having. Я хочу сравнить две суммы, имеющие одинаковую ставку, но разные поля sens. Я получаю этот вывод:

 SELECT v.bid 
FROM   v1 v 
WHERE  sens = 'c' 
GROUP  BY bid 
HAVING Sum(mont) < (SELECT Sum(l.mont) 
                    FROM   v1 l 
                    WHERE  sens = 'd' 
                           AND l.bid = v.bid group by l.bid); 
  

ОШИБКА 1054 (42S22): поле ‘v.ставка неизвестна в списке полей`

Редактировать: V1 — это представление, я использовал псевдонимы l и v, пытаясь привязать вложенный запрос к основному запросу

Извините, ребята, спасибо всем за ваши ответы, у меня была проблема со столбцами исходной таблицы, и теперь она решена 🙂

Комментарии:

1. Опубликовать сценарий V1 !! -> CREATE VIEW v1 AS... ???

Ответ №1:

Нет необходимости в двух выборках из этой таблицы, вы можете использовать CASE EXPRESSION для этой цели :

 SELECT v.bid FROM v1 v
GROUP BY v.bid
HAVING SUM(CASE WHEN v.sens = 'c' THEN v.mont ELSE 0 END) <
       SUM(CASE WHEN v.sens = 'd' THEN v.mont ELSE 0 END) 
   AND COUNT(CASE WHEN v.sens = 'c' THEN 1 END) > 0
  

Комментарии:

1. Этого не должно произойти: S У вас есть столбец bid в таблице v1 ? @Bili

2. @Bili маловероятно, если только у вас нет поля bid в таблице v1.

3. это представление, а не таблица, и да, у него есть ставка столбца

4. @Bili Тогда, пожалуйста, опубликуйте представление DDL.

5. я хочу получить ставку, имеющую сумму (mont) ‘c’ <сумму (mont) ‘d’, есть много строк, имеющих одинаковую ставку и одинаковые значения, я суммирую строки, имеющие ssame ‘d’ и тот же ‘c’, оба имеют одинаковую ставку

Ответ №2:

Псевдоним в подвыборке недоступен / недоступен, поэтому вы получаете ошибку и столбец не найден, но вы можете реорганизовать свой запрос таким образом

   select  v.bid, t.tot 
      from v1 v 
    Join (
       select  bid, sum(mont)  tot
        from v1  
        where sens = 'd' 
        group by bid
        ) t on t.bid = v.bid
    where v.sens = 'c' 
    and v.bid < tot
  

Комментарии:

1. псевдоним не виден, да, но не является ли более прямым способом написания этого запроса???

2. @Bili . извините, в псевдониме ошибка .. я обновил запрос..

3. @Bill для меня такого рода запросы (с использованием агрегированной функции в join являются мощным способом фильтрации и выбора смешанного значения (агрегированного, а не агрегированного), выбираемого из разных таблиц

4. mysql> select v.bid, t.tot -> from v1 v -> Join ( -> select id, sum(mont) tot -> from v1 -> where sens = 'd' -> group by id -> ) t on t.id = v.id -> where v.sens = 'c' -> and v.bid < tot; ERROR 1054 (42S22): Champ 'id' inconnu dans field list mysql>

5. @Bili . прошу прощения за несоответствие идентификатора с bid .. ответ обновлен

Ответ №3:

У меня возникла проблема с видимостью столбцов, потому что представление было объявлено неправильно, я прошу прощения, ребята:'( я чувствую себя очень плохо 🙁

сценарий:

 mysql> select * from op;
 ------ ------ ------ ------ 
| bid  | cid  | sens | mont |
 ------ ------ ------ ------ 
|    1 |    1 | c    | 2000 |
|    1 |    1 | c    | 2000 |
|    1 |    1 | c    | 2000 |
|    1 |    1 | c    | 2000 |
|    1 |    2 | c    | 2000 |
|    1 |    3 | c    | 2000 |
|    2 |    3 | c    | 2000 |
|    1 |    1 | d    | 2000 |
|    2 |    3 | d    | 4000 |
 ------ ------ ------ ------ 
9 rows in set (0.00 sec)


create view v1 as ( select bid , cid , sens , sum(mont) as sumcli from op group by bid,cid,sens);

mysql> select * from v1 ;
 ------ ------ ------ -------- 
| bid  | cid  | sens | sumcli |
 ------ ------ ------ -------- 
|    1 |    1 | c    |   8000 |
|    1 |    1 | d    |   2000 |
|    1 |    2 | c    |   2000 |
|    1 |    3 | c    |   2000 |
|    2 |    3 | c    |   2000 |
|    2 |    3 | d    |   4000 |
 ------ ------ ------ -------- 
6 rows in set (0.00 sec)

mysql> SELECT v.bid
    -> FROM   v1 v
    -> WHERE  sens = 'c'
    -> group by v.bid
    -> HAVING Sum(v.sumcli) < (SELECT Sum(l.sumcli)
    ->                     FROM   v1 l
    ->                     WHERE  sens = 'd'
    ->                            AND l.bid = v.bid group by l.bid);
 ------ 
| bid  |
 ------ 
|    2 |
 ------ 
1 row in set (0.00 sec)
  

Комментарии:

1. Добро пожаловать в StackOverflow. Вместо того, чтобы отвечать с подробностями, вам следует отредактировать свой вопрос, чтобы поместить туда объявление представления, поскольку это необходимо для воспроизведения полученной ошибки. Затем в своем ответе вы можете указать на проблему и способы ее решения (но не вводить новые детали, которые относятся к вопросу).