WHERE子句中不接受聚合函数

时间:2020-05-10 16:16:15

标签: sql postgresql group-by aggregate-functions where-clause

我有以下命令。

SELECT
 supplier_name, EXTRACT(DOW FROM received) AS day_of_week, SUM(quantity) AS total_quantity
FROM 
 supplier NATURAL JOIN store
WHERE
 item_id = (SELECT item_id FROM item WHERE item_name='Samsung Galaxy A50 A505F')
 AND
 received >= TIMESTAMP '2019-03-01 00:00:00 Europe/Prague'
 AND 
 received <  TIMESTAMP '2019-04-01 00:00:00 Europe/Prague'
 AND
 supplier_name='Amazon'
 AND
 day_of_week=3 -- this is the problem
GROUP BY
 supplier_name, day_of_week;

使用此PostgreSQL模式。

item(item_id, item_name)
supplier(supplier_id, supplier_name)
store(id, item_id, supplier_id, price, vat, quantity, received)

AND day_of_week=3添加到WHERE后,出现以下错误。

pgdb->     GROUP BY
pgdb->      supplier_name, day_of_week;
ERROR:  column "day_of_week" does not exist
LINE 14:      day_of_week=3

为什么不能限制此列?

1 个答案:

答案 0 :(得分:1)

您不能在where子句中使用派生列。一个简单的解决方案是横向连接:

SELECT . . ., v.day_of_week, . . .
FROM supplier su JOIN
     store st
     ON ??? CROSS JOIN LATERAL
     (VALUES (EXTRACT(DOW FROM ?.received))) v(day_of_week)
WHERE . . . AND
      v.day_of_week = 3
GROUP BY . . .

一些建议:

  • 请勿使用NATURAL JOIN。它没有任何“自然”的东西,因为它不能识别正确声明的外键关系。而且非常容易出错。因为JOIN条件没有明确说明,所以它使其他人(甚至通常是将来的自己)也看不懂代码。
  • 使用表别名。
  • 限定查询中的所有列引用。