PostgreSQL何处计数条件
我在PostgreSQL中有以下查询:PostgreSQL何处计数条件,sql,postgresql,group-by,having,Sql,Postgresql,Group By,Having,我在PostgreSQL中有以下查询: SELECT COUNT(a.log_id) AS overall_count FROM "Log" as a, "License" as b WHERE a.license_id=7 AND a.license_id=b.license_id AND b.limit_call > overall_count GROUP BY a.license_id; 为什么会出现此错误:
SELECT
COUNT(a.log_id) AS overall_count
FROM
"Log" as a,
"License" as b
WHERE
a.license_id=7
AND
a.license_id=b.license_id
AND
b.limit_call > overall_count
GROUP BY
a.license_id;
为什么会出现此错误:
错误:“总计数”列不存在
我的表格结构:
License(license_id, license_name, limit_call, create_date, expire_date)
Log(log_id, license_id, log, call_date)
我想检查许可证是否已达到特定月份的呼叫限制。where查询无法识别您的列别名,而且,您试图在聚合后过滤掉行。尝试:
SELECT
COUNT(a.log_id) AS overall_count
FROM
"Log" as a,
"License" as b
WHERE
a.license_id=7
AND
a.license_id=b.license_id
GROUP BY
a.license_id
having b.limit_call > count(a.log_id);
having
子句与where
子句类似,只是它处理聚合后的列,而where
子句处理聚合前的列
另外,表名用双引号括起来有什么原因吗
SELECT a.license_id, a.limit_call
, count(b.license_id) AS overall_count
FROM "License" a
LEFT JOIN "Log" b USING (license_id)
WHERE a.license_id = 7
GROUP BY a.license_id -- , a.limit_call -- add in old versions
HAVING a.limit_call > count(b.license_id)
自Postgres 9.1以来,主键覆盖了GROUP BY
子句中表的所有列。在旧版本中,您必须将a.limit\u call
添加到分组依据列表中。委员会:
在查询目标列表中,当主
键在GROUP BY
子句中指定
进一步阅读:
您在WHERE
子句中的条件必须移动到HAVING
子句,因为它引用了聚合函数的结果(在WHERE
应用之后)。您不能在HAVING
子句中引用输出列(列别名),在该子句中只能引用输入列。所以你必须重复这个表达式
输出列的名称可用于引用中列的值
ORDER BY
和GROUP BY
子句,但不在WHERE
或HAVING
条款;在这里,你必须写出表达式
我在FROM
子句中颠倒了表的顺序,并对语法进行了一些清理,以减少混淆使用
在这里仅仅是一种方便的表示方式
我使用了左加入
而不是加入
,因此您根本不排除没有任何日志的许可证
count()
只对非空值进行计数。由于您希望统计表“Log”
中的相关条目,因此使用计数(b.license\u id)
更安全,也更便宜。此列用于联接,因此我们不必担心该列是否可以为null。
count(*)
甚至更短,速度也稍快。如果您不介意获得左表中0
行的1
计数,请使用该计数
旁白:如果可能的话,我建议不要在博士后使用。非常容易出错。纯条件计数(*):
所以你:
- 对于条件从未满足的组,获取
0
- 可以根据需要添加任意数量的count(*)列
筛选出条件不匹配的组:
注意:除非您按limit\u call
分组,否则不能使用HAVING b.limit\u call>..
。但是您可以使用agregate函数将组中的许多“limit_调用”映射到单个值中。例如,在您的情况下,可以使用MAX
:
SELECT COUNT(a.log_id) AS overall_count
FROM "Log" as a
JOIN "License" b ON(a.license_id=b.license_id)
GROUP BY a.license_id
HAVING MAX(b.limit_call) > COUNT(a.log_id)
并且不需要在第一行和最后一行复制COUNT(a.log\u id)
表达式。Postgres将对其进行优化。我发现错误“b.limit\u call”列必须出现在GROUP BY子句中,或在“使用HAVING时”聚合函数中使用,然后您也需要按该列进行分组。由于我不知道您的数据结构,您必须为group by
子句找出适当的列列表。您好,Erwin,谢谢。它对我有效,但我不想在结果中返回b.limit\u调用。顺便说一句,9.1版有什么不同?@Hadi:在这个查询中,你可以从选择列表中删除任何列,没有问题。请参阅我的修订答案,了解第9部分的新增内容。1@ErwinBrandstetter,如果/因为“you”加入主键时通常有许多“b”记录,“new in 9.1”如何工作?@epox:一旦PK(隐式UNIQUE NOT NULL
)位于分组依据
列表中,将同一表中的任何其他列添加到同一分组依据
列表不会更改结果。(这些是“功能相关的”。)在加入许多行之后仍然如此。我明白了,所以a
组是唯一的(1行)组,任何a
s列都可以用于9.1以后的组。但是,如果“您”在have中需要b
列,则在没有COUNT(b.x)或包含在GROUP BY中的情况下,您将无法使用它。谢谢
SELECT COUNT(a.log_id) AS overall_count
FROM "Log" as a
JOIN "License" b ON(a.license_id=b.license_id)
GROUP BY a.license_id
HAVING MAX(b.limit_call) > COUNT(a.log_id)