选定的非聚合值必须是关联组的一部分

时间:2013-06-29 09:48:29

标签: sql group-by case teradata

我在Teradata中有两个表:Table_A和Table_B。他们之间是LEFT JOIN。之后我正在制作包含两个表中属性的SELECT语句:

SELECT
attribute_1
attribute_2
...
attribute_N

后记,我使用SUM函数进行某些计算。这些函数看起来像这样:

SUM (
CASE WHEN Attribute_1 > 2 THEN attribute_2*1.2
ELSE 0
End

(在本例中,使用了选择部分中的属性)。

但是我也在CASE部分属性中使用了不在select语句中的东西 - 这就是这个:

SUM (
CASE WHEN Attribute_X > 2 THEN attribute_Y*1.2
ELSE 0
End

当然最后我正在做GROUP BY 1,2,...,N

我得到的错误是“选定的非聚合值必须是关联组的一部分。” 此外,我已经检查了SELECT部分​​中所选属性数十亿倍,它是N. 问题是 - 为什么我会收到此错误?是因为我在SUM部分使用的是CASE部分属性(attribute_X和attribute_Y),它们不包含在SELECT部分​​中?

结束语的蓝图看起来很像。像这样:

INSERT INTO table_new

SELECT
attribute_1,
attribute_2,
...
attribute_N,

SUM (
CASE WHEN Attribute_1 > 2 THEN attribute_2*1.2
ELSE 0
End
) as sum_a,

SUM (
CASE WHEN Attribute_X > 2 THEN attribute_Y*1.2
ELSE 0
End
) as sum_X

FROM table_a LEFT JOIN table_B
ON ...

GROUP BY 1,2,...,N

2 个答案:

答案 0 :(得分:7)

错误消息表明您未在SELECT表达式中包含GROUP BY语句中列出的所有非汇总列。我猜你列的列数多于“占位符”。

避免这种情况的最佳方法是明确命名所有列,而不是使用“相对定位”语法。换句话说,而不是使用GROUP BY 1,2,...N使用:

GROUP BY
   attribute_1,
   attribute_2,
   ...
   attribute_N

如果这不能解决您的问题,请修改您的问题并显示无效的完整查询。

答案 1 :(得分:0)

我发现错误 - SUM部分由更多子部分组成。例如“amount - SUM(...)+ SUM(...)”。我已经在“金额”部分中包含了属性。