簡體   English   中英

無效操作:列“[column_name]”必須出現在 GROUP BY 子句中或在聚合 function 中使用;

[英]Invalid operation: column “[column_name]” must appear in the GROUP BY clause or be used in an aggregate function;

我已經閱讀了近 10 多個與我相關的問題,但沒有人在我的情況下工作。 因為我的數據庫中有 3 張表,我正在嘗試根據時間計算它們的銷售額(年度銷售額)。 我需要按date_added對我的查詢進行GROUP BY MYSQL ,它工作得很好並且給了我很好的結果,但是在紅移中我被卡住了。

MYSQL 查詢

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 查詢工作得很好,但是當我將它轉換為 RedShift 的 POSTGRE 格式時,它給了我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 查詢中是否有任何語法錯誤以及為什么我需要在GROUP BY中添加o.date_added

您的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-小提琴

有關now() function 的使用,請參閱 Redshift 文檔 請改用getdate() ,因為now()似乎已被棄用

包含GROUP BY的查詢中的ORDER 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

In MySQL this takes advantage of its notorious nonstandard handling of GROUP BY (read this. https://dev.mysql.com/doc/refman/8.0/en/group-by-handling.html )

你想要的是得到一個在多個 DBMS 中工作的查詢,而不是這個。

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

o.date_added添加到您的GROUP BY子句是不正確的,因為您不是按整個日期分組,而是按日期的月份和年份分組。

我發現了錯誤。我使用了 SQL 工作台並得到關於我在POSTGRE查詢中使用的NOW() function 的錯誤。

簡單地說,我用CURRENT_DATE替換了NOW()並且事情對我有用。 另外,我得到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 工作台。 它解釋了錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM