Недопустимая операция: столбец "[column_name]" должен присутствовать в предложении GROUP BY или использоваться в статистической функции; - PullRequest
0 голосов
/ 11 ноября 2019

Я прочитал почти 10+ вопросов, связанных с моим, но никто не работал в моем случае. Поскольку у меня есть 3 таблицы в моей БД, и я пытаюсь рассчитать продажи из них по времени (Годовая продажа). где мне нужно GROUP BY мой запрос по date_added. В MYSQL все работало нормально и дает хороший результат, но в красном смещении я застрял.

MYSQL QUERY :

SELECT
MONTHNAME(o.date_added) AS MONTH,
YEAR(o.date_added) AS YEAR,
COUNT(o.order_id) AS orders,
FROM
order o
LEFT JOIN(
SELECT
    op.order_id,
    SUM(op.quantity) AS op_qty,
    SUM(op.total) AS total,
    SUM(op.cost) AS cost
FROM
    order_product op
GROUP BY
    op.order_id
) op
ON
op.order_id = o.order_id
LEFT JOIN(
SELECT
    order_id,
    SUM(IF(CODE = 'coupon', VALUE, 0)) AS coupon
FROM
    order_total
WHERE
    1
GROUP BY
    order_id
) ot
ON
ot.order_id = o.order_id
WHERE
(
    DATE(o.date_added) >= DATE_ADD(NOW(), INTERVAL - 24 MONTH) AND DATE(o.date_added) <= 
DATE(NOW())) AND(o.order_status_id = '22' OR o.order_status_id = '23')
GROUP BY
    MONTH(o.date_added),
    YEAR(o.date_added)
ORDER BY
    date_added ASC
LIMIT 0, 25

Этот запрос MYSQL работает очень хорошо, но когда я конвертирую его в формат POSTGRE RedShift, он выдает ошибку Invalid operation: column "o.date_added" must appear in the GROUP BY clause or be used in an aggregate function;

Запрос POSTGRES :

SELECT
EXTRACT(MONTH FROM o.date_added) AS month,
EXTRACT(YEAR FROM o.date_added) AS year,
COUNT(o.order_id) AS orders
FROM
orders o  
LEFT JOIN
(
    SELECT
        op.order_id,
        SUM(op.quantity) AS op_qty,
        SUM(op.total) AS total,
        SUM(op.cost) AS cost            
    FROM
        order_product op 
    GROUP BY
        op.order_id
) op 
    ON op.order_id = o.order_id             
LEFT JOIN
(
    SELECT
        order_id,
        SUM(CASE 
            WHEN CODE = 'coupon' THEN VALUE 
            ELSE 0 
        END) AS coupon                      
    FROM
        order_total 
    WHERE
        1 
    GROUP BY
        order_id
) ot 
ON ot.order_id = o.order_id                        
WHERE
(
    DATE(o.date_added) >= now() + interval '-24 month' 
    AND DATE(o.date_added) <= DATE(NOW())
)                               
AND (
    o.order_status_id = '22' 
    OR o.order_status_id = '23'
)                               
GROUP BY
(EXTRACT(MONTH FROM o.date_added), EXTRACT(YEAR FROM o.date_added))
ORDER BY
o.date_added ASC LIMIT 25

Есть ли какая-либо синтаксическая ошибка в запросе postgre, а также почему мне нужно добавить o.date_added в GROUP BY

Ответы [ 3 ]

1 голос
/ 11 ноября 2019

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

Вы можете использовать:

ORDER BY month asc, year asc LIMIT 25

Также вы можете удалить дополнительные скобки из GROUP BY:

GROUP BY EXTRACT(MONTH FROM o.date_added), EXTRACT(YEAR FROM o.date_added)

DB-Fiddle

См. Документацию Redshift для использования функции now(). Вместо этого используйте getdate(), так как now() кажется устаревшим .

0 голосов
/ 14 ноября 2019

Я обнаружил ОШИБКУ. Я использовал SQL Workbench и получил ошибку об NOW() функции, которую использовал в своем запросе POSTGRE.

Просто я просто заменил NOW() на CURRENT_DATE, и у меня все заработало. Кроме того, я получаю сообщение об ошибке для LIMIT 0, 25, но в POSTGRE они позволяют LIMIT 25 [OFFSET n].

Теперь мой запрос выглядит так:

SELECT
EXTRACT(MONTH FROM o.date_added) AS month,
EXTRACT(YEAR FROM o.date_added) AS year,
COUNT(o.order_id) AS orders
FROM
orders o  
LEFT JOIN
(
    SELECT
        op.order_id,
        SUM(op.quantity) AS op_qty,
        SUM(op.total) AS total,
        SUM(op.cost) AS cost            
    FROM
        order_product op 
    GROUP BY
        op.order_id
) op 
    ON op.order_id = o.order_id             
LEFT JOIN
(
    SELECT
        order_id                       
    FROM
        order_total 
    WHERE
        1 
    GROUP BY
        order_id
) ot 
    ON ot.order_id = o.order_id                        
WHERE
(
    DATE(o.date_added) >= CURRENT_DATE + interval '-24 month' 
    AND DATE(o.date_added) <= DATE(CURRENT_DATE)
)                              
GROUP BY EXTRACT(MONTH FROM o.date_added), EXTRACT(YEAR FROM o.date_added)
ORDER BY year ASC, month ASC LIMIT 25

ПРИМЕЧАНИЕ. ЕСЛИ ВЫ РАБОТАЕТЕ НАRedShift. ЭТО НЕ ПОЛУЧИТЕ ОБ ОШИБКЕ. Я РЕКОМЕНДУЮ ИСПОЛЬЗОВАТЬ SQL WORKBENCH. ОБЪЯСНЕНИЕ ОБ ОШИБКЕ.

0 голосов
/ 11 ноября 2019

Столбец в предложении ORDER BY в запросе, содержащем GROUP BY, работает так, как если бы он был упомянут в предложении SELECT.

У вас есть

SELECT
MONTHNAME(o.date_added) AS MONTH,
YEAR(o.date_added) AS YEAR,
COUNT(o.order_id) AS orders,
FROM
order o 
...
GROUP BY
    MONTH(o.date_added),
    YEAR(o.date_added)
ORDER BY
    date_added ASC
LIMIT 0, 25

В MySQLэто использует его пресловутую нестандартную обработку GROUP BY (прочитайте это. https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html)

То, что вы хотите, чтобы получить запрос, который работает в нескольких СУБД, это вместо этого.

ORDER BY
    MONTH(o.date_added) ASC,
    YEAR(o.date_added) ASC   

Добавление o.date_added к вашему предложению GROUP BY неверно, поскольку вы группируете не по всей дате, а по месяцу и году даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...