首页 > 解决方案 > WHERE 子句中不接受聚合函数

问题描述

我有以下命令。

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=3WHERE我收到以下错误。

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

为什么我不能限制此列?

标签: sqlpostgresqlgroup-byaggregate-functionswhere-clause

解决方案


您不能在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没有明确说明标准。
  • 使用表别名。
  • 限定查询中的所有列引用。

推荐阅读