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; 为什么会出现此错误:

我在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;
为什么会出现此错误:

错误:“总计数”列不存在

我的表格结构:

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)