Sql 总和(大小写…)和大小写时的差值。。。然后求和(…)

Sql 总和(大小写…)和大小写时的差值。。。然后求和(…),sql,postgresql,Sql,Postgresql,我遇到了表达(博士后): 这让我大吃一惊。好的,当出现时,情况下是否有分组依据是有意义的 当是某种专有的SQL扩展时,有人能确认在案例中使用聚合吗 我通常使用这样的形式: SELECT ..., sum(CASE WHEN colXX in (...) THEN colYY END) FROM tbl ...; 即使colXX不在groupby中并且具有明确的语义,它也可以工作 此外,PostgreSQL和HSQLDB对前一种形式也有奇特的语法: SELECT ..., sum

我遇到了表达(博士后):

这让我大吃一惊。好的,当出现时,
情况下是否有
分组依据
是有意义的

是某种专有的SQL扩展时,有人能确认在
案例中使用聚合吗

我通常使用这样的形式:

SELECT
  ...,
  sum(CASE WHEN colXX in (...) THEN colYY END)
FROM tbl ...;
即使
colXX
不在
groupby
中并且具有明确的语义,它也可以工作

此外,PostgreSQL和HSQLDB对前一种形式也有奇特的语法:

SELECT
  ...,
  sum(colYY) FILTER (WHERE colXX in (...))
FROM tbl ...;

所以我的问题是:哪种标准或专有扩展定义了
CASE
中的聚合,这种表达式的语义是什么,使用这种构造时有哪些限制?

所有三种语法都是ISO/ANSI标准。第三种方法是使用
filter
,它只在少数数据库中可用(Postgres、SQLite的最新版本以及其他一些数据库)

它们的作用完全相同:

sum(colYY) FILTER (WHERE colXX in (...))
sum(CASE WHEN colXX in (...) THEN colYY END)
它们在满足条件的行上求和。这些要求,
GROUP BY
子句中不包含提及的列(无论是
colXX
还是
colYY
)。事实上,如果其中一个在
组中,则通常不使用它们

这:

这完全不同。它要求
colXX
组中。它将计算
colXX
条件为真的任何行上的总和。其他行的值将为
NULL
。根据我的经验,这个版本比其他两个版本更不常用


是一个用来说明发生了什么的数据小提琴。

说“标准”是指它是由一个SQL标准描述的?@gavenkoa。对但是作为标准并不意味着它们实际上在任何真实的数据库中实现(尽管基本上所有数据库都支持带有
大小写的版本)。看起来内部聚合的唯一有效谓词是
=
/
/
in
。似乎无法作为旁注检查
过滤器也受HSQLDB(如问题中所述)和当前SQLite版本的支持。@gavenkoa。我不知道你的意思——应该允许使用任何表达式,包括使用子查询的复杂表达式。如果你正在尝试的东西不起作用,也许你应该问另一个问题。
sum(colYY) FILTER (WHERE colXX in (...))
sum(CASE WHEN colXX in (...) THEN colYY END)
(CASE WHEN colXX in (...) THEN sum(colYY) END)