iif 函数中的列在 select 列表中无效,因为它未包含在聚合函数或 GROUP BY 子句中

Column in iif function invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause

尝试在 IIF 函数中使用未包含的字段并收到错误消息,指出该字段不是 GROUP BY CLAUSE 的一部分。

SELECT IIF(T1.a = 0, 'none', T1.type) AS type, COUNT(*) AS mycnt
FROM T1
GROUP BY type

为什么?在 T1.a 为 0 的情况下,T1.type 中没有值,所以我想用一些东西来填充它。

我完全理解 SELECTed 列必须位于 GROUP BY 子句中,以便它知道 GROUPed 记录中的值。但我并不是要它给我一个不可知的值 T1.a。我只是想让它在收集记录然后聚合时考虑 T1.a 的值。

还有其他方法可以填充吗?我有一些非常密集的 WHERE 子句,所以从差异 UNION 中选择的想法看起来有点混乱。

主要问题是关于 GROUP BY 项的函数依赖性。

您的 GROUP BY 术语(类型)不是指派生列 AS type,而是指 T1.type,这意味着 T1.a 在功能上不依赖于 GROUP BY 术语,除非 T1.type 恰好是 PRIMARY KEY 或 UNIQUE 且 NOT NULL,并且您的数据库理解这种功能依赖性。有些数据库不理解这一点(SQL 标准的一部分)。

如果你想GROUP BY derived_type,你可以做更多这样的事情:

WITH T1a AS (
         SELECT IIF(T1.a = 0, 'none', T1.type) AS type
           FROM T1
     )
SELECT type
     , COUNT(*) AS mycnt
  FROM T1a
 GROUP BY type
;

The fiddle

测试用例:

CREATE TABLE T1 ( type VARCHAR(10), a int );

WITH T1a AS (
         SELECT IIF(T1.a = 0, 'none', T1.type) AS type FROM T1
     )
SELECT type
     , COUNT(*) AS mycnt
  FROM T1a
 GROUP BY type
;

您需要在 select 子句中使用相同的 GROUP BY 表达式。 您可以使用如下代码:

SELECT IIF(T1.a = 0, 'none', T1.type) AS type, COUNT(*) AS mycnt
FROM T1
GROUP BY IIF(T1.a = 0, 'none', T1.type)