[英]SQL: Column Must Appear in the GROUP BY Clause Or Be Used in an Aggregate 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
包含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.