【问题标题】:Teradata - What is wrong with this query? "Selected non-aggregate values must be part of the associated group."Teradata - 这个查询有什么问题? “选定的非聚合值必须是关联组的一部分。”
【发布时间】:2018-07-15 01:10:29
【问题描述】:

我目前正在使用 teradata 解决 sql 问题,但我一直收到错误消息,尽管我找不到任何问题。 这是我的查询:

SELECT TOP 10 d.deptdesc, tt.store, SUM(tt.amt11) AS sum11, SUM(tt.amt12) AS sum12,
        SUM(tt.num11) AS num11, SUM(tt.num12) AS num12,
        sum11/num11 AS avg11, sum12/num12 AS avg12,
        (avg12-avg11)/avg11 * 100 AS increase
FROM(SELECT store, 
        SUM(CASE monthId WHEN 11 THEN total_revenue END) AS amt11,
        SUM(CASE monthId WHEN 12 THEN total_revenue END) AS amt12,
        SUM(CASE monthId WHEN 11 THEN date_num END) AS num11,
        SUM(CASE monthId WHEN 12 THEN date_num END) AS num12
    FROM(SELECT EXTRACT(MONTH FROM saledate) AS monthId,
                EXTRACT(YEAR FROM saledate) AS yearId,
                store,
                SUM(amt) AS total_revenue,
                COUNT(DISTINCT saledate) AS date_num       
            FROM trnsact
            WHERE stype = 'P' AND NOT(monthId = '8' AND yearId = '2005') 
            GROUP BY monthId, yearId, store
            HAVING date_num >= 20) t
    GROUP BY store) tt 
INNER JOIN (SELECT sku, store FROM trnsact) ttt ON tt.store = ttt.store 
INNER JOIN skuinfo sku ON ttt.sku = sku.sku
INNER JOIN deptinfo d ON sku.dept = d.dept
GROUP BY d.deptdesc, tt.store
HAVING sum11 > 1000 AND sum12 > 1000
ORDER BY increase DESC;

Teradata 发出这样的信息

错误代码 - 3504
错误消息 - [Teradata Database] [TeraJDBC 15.10.00.05] [Error 3504] [SQLState HY000] 选定的非聚合值必须是关联组的一部分。

你能给我什么建议吗? 提前致谢!

【问题讨论】:

  • avg11avg12 increase 应该出现在最后一个 group by
  • “错误代码 - 3625 错误消息 - [Teradata Database] [TeraJDBC 15.10.00.05] [错误 3625] [SQLState HY000] GROUP BY 和 WITH...BY 子句可能不包含聚合函数。”还是不行……

标签: sql aggregate teradata


【解决方案1】:

解析器检查您别名为聚合的非聚合列,但 您不能直接在 select 中为 select 列使用别名,因此您应该使用:

SELECT TOP 10 
  d.deptdesc
  , tt.store
  , SUM(tt.amt11) AS sum11
  , SUM(tt.amt12) AS sum12
  , SUM(tt.num11) AS num11
  , SUM(tt.num12) AS num12
  , SUM(tt.amt11)/SUM(tt.num11) AS avg11
  , SUM(tt.amt12)/SUM(tt.num12) AS avg12
  , (SUM(tt.amt12)/SUM(tt.num12)-SUM(tt.amt11)/SUM(tt.num11))/SUM(tt.amt11)/SUM(tt.num11) * 100 AS increase
  ....

【讨论】:

  • @MichelleRainbelt 你要求一个错误..当你告诉我错误消失了..如果查询返回你喜欢或不喜欢的结果不是一个问题..所以你应该认识到我的答案是正确的,因此将其标记为已接受.. 其他问题您应该将它们发布为新问题
  • 哎呀,没有冒犯!我只是感到沮丧的是,即使查询已得到纠正,结果也不像答案。感谢您的帮助。
  • @MichelleRainbelt:事实上,您可以在 Teradata 的任何地方使用别名(这违反了标准 SQL 的所有规则,但 真的我>很好)。但是解析器首先在现有列的列表中搜索列,并且只有在别名列表中找不到该列时才搜索该列。因此,您的问题是SUM(tt.num11) AS num11 之类的别名,在sum11/num11 中,第一个sum11 很好,但第二个num11 解析为tt.num11,而不是总和。基本规则:当你想使用它时,永远不要分配一个已经作为列名存在的别名
  • @MichelleRainbelt 无意冒犯 .. 当然 .. 对新问题的建议是让一个清晰的方法来解决这个问题,而不会“在路上”改变让一切变得如此复杂......然后当你已经发布了带有适当数据样本和预期结果的新问题..您可以评论我的相关链接,这样我就可以看一下..无论如何..谢谢..
  • @dnoeth 感谢您的详细解释。现在一切似乎都清楚了!
【解决方案2】:

使用这个查询:

SELECT TOP 10  deptdesc, store, sum11, sum12, num11, num12,
            sum11/num11 AS avg11, sum12/num12 AS avg12,
            ((sum12/num12)-(sum11/num11))/(sum11/num11)* 100 AS increase FROM
(
    SELECT d.deptdesc, tt.store, SUM(tt.amt11) AS sum11, SUM(tt.amt12) AS sum12,
            SUM(tt.num11) AS num11, SUM(tt.num12) AS num12
    FROM(SELECT store, 
            SUM(CASE monthId WHEN 11 THEN total_revenue END) AS amt11,
            SUM(CASE monthId WHEN 12 THEN total_revenue END) AS amt12,
            SUM(CASE monthId WHEN 11 THEN date_num END) AS num11,
            SUM(CASE monthId WHEN 12 THEN date_num END) AS num12
        FROM(SELECT EXTRACT(MONTH FROM saledate) AS monthId,
                    EXTRACT(YEAR FROM saledate) AS yearId,
                    store,
                    SUM(amt) AS total_revenue,
                    COUNT(DISTINCT saledate) AS date_num       
                FROM trnsact
                WHERE stype = 'P' AND NOT(monthId = '8' AND yearId = '2005') 
                GROUP BY monthId, yearId, store
                HAVING date_num >= 20) t
        GROUP BY store) tt 
    INNER JOIN (SELECT sku, store FROM trnsact) ttt ON tt.store = ttt.store 
    INNER JOIN skuinfo sku ON ttt.sku = sku.sku
    INNER JOIN deptinfo d ON sku.dept = d.dept
    GROUP BY d.deptdesc, tt.store
) AS T
    GROUP BY deptdesc, tt.store, sum11, sum12, num11, num12
    HAVING sum11 > 1000 AND sum12 > 1000
    ORDER BY increase DESC;

【讨论】:

  • 现在发出不同的错误消息..“发生错误...... [com.teradata.commons.datatools.sqlparsers.common.ParseException: Encountered "GROUP" at line 28, column 5. was期待以下之一:“as” ... ... ]"
  • “发生错误...... [com.teradata.commons.datatools.sqlparsers.common.ParseException:在第28行第5列遇到“GROUP”。期待以下之一:“as”...... . ... ]" 嗯似乎还是不对...
  • @MichelleRainbelt 我的查询解决了您的问题我尝试解决您的次要问题以完成您的查询
  • Teradata 需要派生表的别名(afaik 仅在 Oracle 中是可选的),只需在最后的 ) 之后添加它,例如) as dt
猜你喜欢
  • 2013-06-27
  • 1970-01-01
  • 2021-12-17
  • 2020-05-14
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 2018-10-18
  • 2015-10-05
相关资源
最近更新 更多