别名在GROUP BY中不可用

问题描述 投票:0回答:3

我必须对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-server tsql group-by alias
3个回答
2
投票

实现SQL就好像按以下顺序执行查询一样:

  1. FROM子句
  2. WHERE子句
  3. GROUP BY子句
  4. HAVING子句
  5. SELECT子句
  6. ORDER BY子句

对于大多数关系数据库系统,此顺序说明哪些名称(列或别名)有效,因为它们必须已在上一步中引入。

因此,在SQL Server中,您无法在SELECT子句中定义的GROUP BY子句中使用术语,因为GROUP BY在SELECT子句之前执行。


0
投票

您不能按表达式进行分组,因为它是一个聚合。 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

告诉你,你不能通过聚合表达式进行分组。


0
投票

重新发布12月12日的评论作为答案。

你可能想用SELECT ... FROM ...包装原始的SELECT * FROM ( /*your original half*/ ) AS T,留下GROUP ... ORDER ...部件。这将允许您引用SELECT部分内部GROUP ... ORDER ...产生的任何别名。

但是,由于GROUP移动到不同的级别,您必须将SUM等聚合移动到新的级别。此外,您将失去对表的直接访问权限,因此很可能您必须将GROUP ... ORDER ...段中使用的表别名更改为T,并确保GROUP ... ORDER ...部分使用的所有列都在内部SELECT中生成。所有这一切都应该很容易处理。

© www.soinside.com 2019 - 2024. All rights reserved.