sql - 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=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
为什么我不能限制此列?
解决方案
您不能在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
没有明确说明标准。 - 使用表别名。
- 限定查询中的所有列引用。
推荐阅读
- r - 以开始和结束日期为条件的随时间的定期总和
- java - Jackson 反序列化多态类型:处理由于类拼写错误导致的错误
- java - 在 Java Springboot 中使用 WSDL 或 XSD 或 XJB 文件创建 SOAP XML 消息
- angular - 仅当用户按下 ok 时确认 Ng Zorro 过滤器中的选择复选框
- vue.js - 当使用多个规则时,规则应该返回一个字符串或布尔值,而不是接收到的“对象”
- prometheus - 如何在 Grafana 标题或 Y 轴上添加标签值?
- php - 我已经完成了我的代码,但页面无法正常工作
- python - 访问作为字符串从 csv 附加到列表的列表元素的问题
- python - 在 docker 网络和主机网络之间中继多播流量
- unity3d - 字典
使用 protobuf-net 序列化时抛出异常