我必须对BaseIncidencia
列进行分组(总和值),但它不可用。正如在SQL Server AS statement aliased column within WHERE statement中所说的那样简单,但我没有列名称可供参考。只有别名。
BEGIN
SELECT @Artigo AS Artigo, T1.Contrib AS ContribID, YEAR(T1.Data) AS Ano, T3.DescricaoMes, CAST(ROUND(SUM(T1.Debito/0.23),2) AS decimal(16,2)) BaseIncidencia,
CAST(ROUND(SUM(T1.Debito),2) AS decimal(16,2)) AS IVA, (CASE WHEN T5.Valid = 'True' THEN 'VALIDO' WHEN T5.Name = '---' THEN 'INEXISTENTE' ELSE 'INVALIDO' END) AS 'ValidadeNIF'
FROM
#CONTAS_INI AS T1
LEFT JOIN
db.dbo.VatCheck T5
ON T1.ContribuinteID = T5.VatNumber
LEFT JOIN
#Meses AS T3
ON MONTH(T1.Data) = T3.Mes
GROUP BY T1.CntID, T1.ContribuinteID, YEAR(T1.Data), (CASE WHEN T5.Valid = 'True' THEN 'VALIDO'
WHEN T5.Name = '---' THEN 'INEXISTENTE' ELSE 'INVALIDO' END), T3.DescricaoMes
ORDER BY (CASE WHEN T5.Valid = 'True' THEN 'VALIDO' WHEN T5.Name = '---' THEN 'INEXISTENTE' ELSE 'INVALIDO' END), T1.ContribuinteID
END
我尝试更换以下行:
GROUP BY T1.CntID, T1.ContribuinteID, YEAR(T1.Data), (CASE WHEN T5.Valid = 'True' THEN 'VALIDO'
附:
GROUP BY T1.CntID, T1.ContribuinteID, YEAR(T1.Data), CAST(ROUND(SUM(T1.Debito/0.23),2) AS decimal(16,2)), (CASE WHEN T5.Valid = 'True' THEN 'VALIDO'
只是为了得到Cannot use an aggregate or a subquery in an expression used for the group by list of a GROUP BY clause.
错误。
所以我的问题是,为什么我不能在GROUP BY中包含BaseIncidencia
别名?什么是解决方法?
实现SQL就好像按以下顺序执行查询一样:
对于大多数关系数据库系统,此顺序说明哪些名称(列或别名)有效,因为它们必须已在上一步中引入。
因此,在SQL Server中,您无法在SELECT子句中定义的GROUP BY子句中使用术语,因为GROUP BY在SELECT子句之前执行。
您不能按表达式进行分组,因为它是一个聚合。 group by values用于确定聚合操作的级别。
作为简化示例:
Select Count(*),
Object_id
From sys.columns
Group by Object_id
这很容易理解。计算每个object_id的列记录数。
你要做的就是相当于
SELECT COUNT( * ),
object_id
FROM sys.columns
GROUP BY COUNT( * ),
object_id
对于每个object_id的计数,给我每个object_id的计数。这没有意义。
您收到的错误消息:
Cannot use an aggregate or a subquery in an expression used for the group by list of a GROUP BY clause
告诉你,你不能通过聚合表达式进行分组。
重新发布12月12日的评论作为答案。
你可能想用SELECT ... FROM ...
包装原始的SELECT * FROM ( /*your original half*/ ) AS T
,留下GROUP ... ORDER ...
部件。这将允许您引用SELECT
部分内部GROUP ... ORDER ...
产生的任何别名。
但是,由于GROUP
移动到不同的级别,您必须将SUM
等聚合移动到新的级别。此外,您将失去对表的直接访问权限,因此很可能您必须将GROUP ... ORDER ...
段中使用的表别名更改为T
,并确保GROUP ... ORDER ...
部分使用的所有列都在内部SELECT
中生成。所有这一切都应该很容易处理。