#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
? @Bili2. @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. Вместо того, чтобы отвечать с подробностями, вам следует отредактировать свой вопрос, чтобы поместить туда объявление представления, поскольку это необходимо для воспроизведения полученной ошибки. Затем в своем ответе вы можете указать на проблему и способы ее решения (но не вводить новые детали, которые относятся к вопросу).