【问题标题】:Teradata SQL with non-aggregated fields in GROUP BYTeradata SQL 在 GROUP BY 中具有非聚合字段
【发布时间】:2017-03-12 20:44:43
【问题描述】:

我有下面的代码表明 Teradata 将不起作用,并将消息返回为“选定的非聚合值必须是关联组的一部分。”我想我已经确保所有非聚合字段都已放入 GROUP BY 子句中。你能帮我看看为什么它不起作用吗?

SELECT  str.store,str.city, str.state, dep.deptdesc, 100*(Clean.DecSales/Clean.DecSaleDays-Clean.NovSales/Clean.NovSaleDays)/(Clean.NovSales/Clean.NovSaleDays) AS PercentageChange

FROM ((skuinfo sku LEFT JOIN deptinfo dep ON sku.dept=dep.dept)

LEFT JOIN 
(SELECT t.sku, t.store, COUNT(DISTINCT t.saledate) AS NumOfDays, SUM(t.amt) AS DailyTotal,

(CAST(EXTRACT(YEAR FROM t.saledate) AS VARCHAR(8)))||'.'||
      (CAST(EXTRACT(MONTH FROM t.saledate) AS VARCHAR(8)))||'.'||
      (CAST(t.store AS VARCHAR(8)))AS ComboID,

SUM(CASE WHEN EXTRACT(MONTH from t.saledate) =11 THEN t.Amt END) AS NovSales,

SUM(CASE WHEN EXTRACT(MONTH from t.saledate) =12 THEN t.Amt END) AS DecSales,

COUNT(CASE WHEN EXTRACT(MONTH from t.saledate) =11 THEN t.saledate END) AS NovSaleDays,

COUNT(CASE WHEN EXTRACT(MONTH from t.saledate) =12 THEN t.saledate END) AS DecSaleDays

FROM trnsact t

WHERE (t.saledate NOT BETWEEN '2005-08-01' AND '2005-08-31') AND t.stype='P'

GROUP BY t.sku, t.store

HAVING NumOfDays>19) Clean 

ON sku.sku=Clean.sku)

LEFT JOIN strinfo str ON str.store=Clean.store

GROUP BY str.store,str.city, str.state, dep.deptdesc;

【问题讨论】:

  • 将表达式 PercentageChange 放入 SUM 或放入 GROUP BY。

标签: mysql sql teradata


【解决方案1】:

这是你的SELECT

SELECT str.store, str.city, str.state, dep.deptdesc,
       (100*(Clean.DecSales/Clean.DecSaleDays-Clean.NovSales/Clean.NovSaleDays)/(Clean.NovSales/Clean.NovSaleDays) ) AS PercentageChange

这是你的GROUP BY

GROUP BY str.store, str.city, str.state, dep.deptdesc

我在 SELECT 中看到很多列引用,而 GROUP BY 中没有。我猜你打算像这样SELECT

SELECT str.store, str.city, str.state, dep.deptdesc,
       SUM(100*(Clean.DecSales/Clean.DecSaleDays-Clean.NovSales/Clean.NovSaleDays)/(Clean.NovSales/Clean.NovSaleDays)
          ) AS PercentageChange

或者在外部查询中根本没有GROUP BY

【讨论】:

    【解决方案2】:

    删除外部查询中的GROUP BY。将派生表Clean 中的GROUP BY 替换为序数GROUP BY 1, 2, 5

    有些东西让我相信派生表的列ComboID,由SaleDateStoreID 组成,因为SaleDate 不是GROUP BY 的一部分,而是在其他地方参与派生表的聚合。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-27
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 2021-02-03
      • 1970-01-01
      • 2021-12-10
      • 1970-01-01
      相关资源
      最近更新 更多