【问题标题】:SELECT Failed. 3504: Selected non-aggregate values must be part of the associated group in v14.10.05.09 and not in v14.00.07.02选择失败。 3504:选定的非聚合值必须是 v14.10.05.09 中关联组的一部分,而不是 v14.00.07.02 中的一部分
【发布时间】:2015-10-05 11:01:44
【问题描述】:

查询的select子句共有9个字段,其中5个是直接字段。其中 2 个是 select 子句中选择查询的结果,另外 2 个是使用 case when 语句中使用的前 2 个字段的结果。 SUM 聚合应用于最后两列。

所有前 5 列都列在 group by 子句中。

查询:

SELECT
sub.a,sub.b,sub.c,Table1.d,Table1.e,

(select x from table t1 where y=current_date) as f,

(select z from table t1 where y=w) as g,

sum(case when f=g then 1 else 0)) as h,

sum(case when f+1=g then 1 else 0)) as i

FROM Table1

LEFT JOIN

(SELECT a,b,c,l,m,n,o FROM Table2 INNER JOIN Table3 ON Table2.p=Table3.t)sub

ON Table1.e = sub.l

GROUP BY sub.a,sub.b,sub.c,Table1.d,Table1.e

上述查询在 Teradata v14.10.05.09 中运行良好,但因

而失败

"SELECT Failed. 3504: 选择的非聚合值必须是 相关组”

在 Teradata v14.00.07.02 中。

这是因为新版本中引入的某些东西导致查询失败但在旧版本中运行良好? 还是我错过了什么?

提前致谢。

这是给出问题的实际查询:SELECT sub.key,sub.div,sub.reg_nm,tb_cal.calendar_yr,tb_cal.calendar_mth, (SEL fiscal_yr FROM db1.tb_cal tb_cal WHERE calendar_dt=CURRENT_DATE) current_fy, (SEL fiscal_yr FROM db1.tb_cal tb_cal WHERE calendar_dt=clse_dt) clse_dt_fy, SUM(CASE WHEN current_fy=clse_dt_fy THEN sub.amt ELSE 0 END) cnt FROM db1.tb_cal tb_cal
LEFT JOIN( SELECT tbl_a.key,tbl_a.stage,COALESCE(tbl_u.div, 'Un-assigned') div,COALESCE(tbl_u.reg_nm,'Un-assigned') reg_nm,tbl_a.clse_dt,tbl_a.amt FROM db_a.tbl_a tbl_a INNER JOIN db1.tbl_u tbl_u
ON tbl_u.unit_key=tbl_a.unit_key WHERE tbl_a.ctg IN ('G','O','C','F','I') AND tbl_a.stage NOT IN ('R', 'D', 'N','A') AND tbl_a.ind = 0 )sub ON sub.clse_dt = tb_cal.calendar_dt GROUP BY sub.key,sub.div,sub.reg_nm,tb_cal.calendar_yr,tb_cal.calendar_mth

【问题讨论】:

  • 您还应该在 group by 子句中包含 f 和 g。 @nhm
  • 但是添加 f 和 g 查询会给我不同的总和结果。总和的计算会出错。我想知道相同的查询如何在 Teradata 的一个实例中正常工作而在另一个实例中失败。为了实现相同的功能,我还能做些什么
  • 尝试将标量子查询更改为 MIN:(select MIN(z) from table t1...)。顺便说一句,将 f 和 g 添加到 GROUP BY 应该不会改变结果,两者似乎都没有相关性......你能显示where y=w的实际代码吗?
  • 将 MIN 添加到标量子查询会导致另一个错误。 y=w 的代码如下: SEL accounting_yr FROM db.tbl1 WHERE calendar_dt=colse_dt
  • 哪个错误? SEL fiscal_yr FROM db.tbl1 WHERE calendar_dt=colse_dt,这是否返回单个值,calendar_dtcolse_dt 都是来自 db.tbl1 的列?或者它是否与 GROUP BY 列之一相关?完整的源代码会很有帮助,否则很难判断 14 或 14.10 是否做错了......

标签: teradata


【解决方案1】:
                        SELECT
                      sub.key,
                      sub.div,
                      sub.reg_nm,
                      tb_cal.calendar_yr,
                      tb_cal.calendar_mth,
                      (SEL  fiscal_yr FROM db1.tb_cal tb_cal WHERE calendar_dt=CURRENT_DATE) current_fy,
                      (SEL fiscal_yr FROM db1.tb_cal tb_cal WHERE calendar_dt=clse_dt) clse_dt_fy,
                      SUM(CASE WHEN current_fy=clse_dt_fy THEN sub.amt ELSE 0 END) cnt
                    FROM db1.tb_cal tb_cal
                     LEFT JOIN(  SELECT
                       tbl_a.key,tbl_a.stage,COALESCE(tbl_u.div, 'Un-assigned') div,COALESCE(tbl_u.reg_nm,'Un-assigned') reg_nm,tbl_a.clse_dt,tbl_a.amt
                      FROM db_a.tbl_a tbl_a
                      INNER JOIN  db1.tbl_u tbl_u
                       ON tbl_u.unit_key=tbl_a.unit_key
                      WHERE tbl_a.ctg IN ('G','O','C','F','I') AND tbl_a.stage NOT IN ('R', 'D', 'N','A') AND tbl_a.ind = 0 
                    ) sub
                    ON sub.clse_dt =  tb_cal.calendar_dt
                    GROUP BY sub.key,sub.div,sub.reg_nm,tb_cal.calendar_yr,tb_cal.calendar_mth,current_fy,clse_dt_fy;

这应该可以正常工作。但是根据您的 cmets,您说将最后一个添加到 group by 的列中会改变您所需的答案。如果是这种情况,您可以发布您想要的结果集。我们可以在这方面为您提供帮助。虽然查看您的查询,但添加 current_fy 和 clse_dt_fy 似乎不会改变您当前的结果集。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 2013-06-27
    • 2021-12-17
    • 2020-05-14
    • 2018-10-18
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多