Почему я получаю сообщение об ошибке в выражении Group BY при использовании жестко закодированных значений в предложении WHERE?

Я новичок в PostgreSQL. Я работаю над приложением бронирования поездки на такси.

Я пытаюсь выяснить, почему (1) не работает. Жестко закодированные значения должны быть заменены пользовательскими данными.

  1. Нерабочий:

    SELECT MAX (cr.pickup_point) AS pickup_point, MAX (cr.destination) AS пункт назначения,
    MAX (cr.leave_time) AS листья_время, MAX (cr.license) AS лицензия,
    MAX (cr.username) AS имя пользователя, MAX (cr.car_ride_id) AS car_ride_id,
    MAX (isd.no_of_seats) AS no_of_seats
    ОТ car_ride cr, is_driver isd ГДЕ cr.username = isd.username
    AND cr.license = isd.license AND
    НИЖНЯЯ (TRIM (pickup_point)) :: varchar = НИЖНЯЯ (TRIM (‘Восточная Пайя Лебар, Пая Лебар’)) :: varchar
    AND (НИЖНЯЯ (TRIM (cr.destination)) :: varchar = НИЖНЯЯ (TRIM (‘Kranji, Sungei Kadut’)) :: varchar
    AND (cr.leave_time)> now () :: timestamp (0)
    GROUP BY (cr.car_ride_id, isd.no_of_seats)
    ИМЕЕТ isd.no_of_seats> ALL (ВЫБЕРИТЕ COUNT (*)) из ставок b, car_ride cr2 ГДЕ
    b.driver_username = cr2.username И b.successful ИСТИНА
    И b.leave_time> now () :: timestamp (0) И cr2.leave_time = b.leave_time
    AND cr.car_ride_id = cr2.car_ride_id)

2.Working:

SELECT  MAX(cr.pickup_point) AS pickup_point , MAX(cr.destination)
AS destination , MAX(cr.leave_time) AS leave_time ,
MAX(cr.license) AS license , MAX(cr.username)
AS username, MAX(cr.car_ride_id) AS car_ride_id , MAX(isd.no_of_seats) AS no_of_seats
FROM car_ride  cr , is_driver isd WHERE cr.username = isd.username
AND cr.license =  isd.license AND
(cr.leave_time)> now()::timestamp(0) GROUP BY(cr.car_ride_id, isd.no_of_seats)  HAVING
isd.no_of_seats>
ALL (SELECT COUNT(*) FROM bids b , car_ride cr2 WHERE
b.driver_username = cr2.username AND b.successful IS TRUE
AND  b.leave_time >now()::timestamp(0) AND cr2.leave_time = b.leave_time
AND cr.car_ride_id = cr2.car_ride_id )

Разница между (1.) и (2.) состоит в том, что первый намеревается отфильтровать результаты на основе точек захвата и пунктов назначения.

Хотя (2) отображает все объявления о поездке на автомобиле, которые находятся в будущем и не полностью забронированы (количество ставок = ИСТИНА для определенного car_ride_id < car_capacity), чтобы автомобиль не был полностью зарезервирован.

Обратите внимание, что я использовал агрегаты MAX очень много раз, потому что я использовал их в качестве скрытых полей в последующей форме для подачи заявки.

Результаты по второму запросу

Сообщение об ошибке при запуске 1-го запроса.

ОШИБКА: синтаксическая ошибка в или около «ГРУППЫ»

Строка 10: GROUP BY (cr.car_ride_id, isd.no_of_seats)

-3

Решение

У вас есть одна ненужная скобка, которую вы не закрывали, между AND а также LOWER:

  AND (LOWER(TRIM(cr.destination))::varchar = LOWER(TRIM('Kranji, Sungei Kadut'))::varchar

Исправлена:

SELECT MAX(cr.pickup_point) AS pickup_point , MAX(cr.destination) AS destination,
MAX(cr.leave_time) AS leave_time,MAX(cr.license) AS license ,
MAX(cr.username) AS username, MAX(cr.car_ride_id) AS car_ride_id ,
MAX(isd.no_of_seats) AS no_of_seats
FROM car_ride cr , is_driver isd
WHERE cr.username = isd.username
AND cr.license = isd.license
AND LOWER(TRIM(pickup_point))::varchar = LOWER(TRIM('Paya Lebar East, Paya Lebar'))::varchar
AND /*(*/LOWER(TRIM(cr.destination))::varchar = LOWER(TRIM('Kranji, Sungei Kadut'))::varchar
AND (cr.leave_time)> now()::timestamp(0)
GROUP BY(cr.car_ride_id, isd.no_of_seats)
HAVING isd.no_of_seats> ALL (SELECT COUNT(*)
FROM bids b , car_ride cr2
WHERE b.driver_username = cr2.username
AND b.successful IS TRUE
AND b.leave_time >now()::timestamp(0)
AND cr2.leave_time = b.leave_time
AND cr.car_ride_id = cr2.car_ride_id)

Эти ошибки легче избежать, когда вы форматируете запросы в более удобном для чтения стиле.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]