group by 语句出错?

Error with group by statement?

我在 运行 此代码时遇到以下错误。请帮帮我。

SELECT store, COUNT(DISTINCT saledate), CountNov, CountDec, SumNov, SumDec, (SumNov/CountNov) AS NovAvgRvn, (SumDec/CountDec) AS DecAvgRvn FROM 
(
SELECT store, saledate, 
CASE WHEN SUM(CASE EXTRACT(MONTH FROM saledate) WHEN '11' THEN amt END) IS NULL THEN 0 
ELSE SUM(CASE EXTRACT(MONTH FROM saledate) WHEN '11' THEN amt END)
END AS SumNov, 
CASE WHEN SUM(CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN amt END) IS NULL THEN 0 
ELSE SUM(CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN amt END)
END AS SumDec, 
CASE WHEN COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '11' THEN saledate END) IS NULL THEN 0 
ELSE COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '11' THEN saledate END)
END AS CountNov, 
CASE WHEN COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN saledate END) IS NULL THEN 0 
ELSE COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN saledate END)
END AS CountDec 
FROM trnsact 
WHERE stype = 'p' 
GROUP BY store, saledate  
) AS T1 
WHERE CountDec > 0 AND CountNov > 0 
GROUP BY store 
ORDER BY store;

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

如果您有 group by 子句,您的 select 语句中的任何不是汇总的内容(如 SUM、AVG 等)都需要包含在您的 group by 子句中

试试这个希望对你有帮助:

SELECT store, COUNT(DISTINCT saledate), CountNov, CountDec, SumNov, SumDec, (SumNov/CountNov) AS NovAvgRvn, (SumDec/CountDec) AS DecAvgRvn FROM 
(
    SELECT store, saledate, 
                CASE WHEN 
                        SUM(CASE EXTRACT(MONTH FROM saledate) 
                                WHEN '11' THEN amt END) IS NULL THEN 0 
                            ELSE SUM(CASE EXTRACT(MONTH FROM saledate) WHEN '11' THEN amt END)
                        END AS SumNov, 
                CASE WHEN SUM(CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN amt END) IS NULL THEN 0 
                            ELSE SUM(CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN amt END)
                        END AS SumDec, 
                CASE WHEN COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '11' THEN saledate END) IS NULL THEN 0 
                            ELSE COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '11' THEN saledate END)
                        END AS CountNov, 
                CASE WHEN COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN saledate END) IS NULL THEN 0 
                            ELSE COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN '12' THEN saledate END)
                        END AS CountDec 
    FROM trnsact 
    WHERE stype = 'p' 
    GROUP BY store, saledate, SumNov, SumDec, CountNov, CountDec
) AS T1 
    WHERE CountDec > 0 AND CountNov > 0 
GROUP BY store, saledate, CountNov, CountDec, SumNov, SumDec, NovAvgRvn, DecAvgRvn
ORDER BY store;

为什么要为此使用嵌套查询?

SELECT store, COUNT(DISTINCT saledate), 
       SUM(CASE EXTRACT(MONTH FROM saledate) WHEN 11 THEN amt ELSE 0 END) as SumNov, 
       SUM(CASE EXTRACT(MONTH FROM saledate) WHEN 11 THEN amt ELSE 0 END) as SumDec, 
       COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN 11 THEN saledate END) as CountNov, 
       COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN 12 THEN saledate END) as CountDec
FROM trnsact 
WHERE stype = 'p' 
GROUP BY store; 

备注:

  • COUNT() 从来没有 returns NULL 所以根本不需要 CASE
  • 使用 ELSE 子句,SUM() 也不会 return NULL(必须没有匹配 SUM() 的行到 return NULL,并且组中没有匹配的行,该组将不存在)。
  • EXTRACT() return是一个数字,所以要与一个数字进行比较。

Derived Table 中的 GROUP BY 没有在月级别上进行聚合,因此 COUNT(DISTINCT saledate) 将是 1。您不应将字符串用于数字数据(EXTRACT 的结果)。您不需要 CASE(SUM) 因为 COUNT 永远不会 returns NULL(您可以使用 COALESCE 代替):

我假设您想要这样的查询:

SELECT store, 
   -- if you only need the dates from Nov & Dec you can simply do
   -- CountNov + CountDec instead 
   COUNT(DISTINCT saledate),

   SUM(CASE EXTRACT(MONTH FROM saledate) WHEN 11 THEN amt ELSE 0 END) AS SumNov, 
   SUM(CASE EXTRACT(MONTH FROM saledate) WHEN 12 THEN amt ELSE 0 END) AS SumDec, 
   COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN 11 THEN saledate END) AS CountNov, 
   COUNT(DISTINCT CASE EXTRACT(MONTH FROM saledate) WHEN 12 THEN saledate END) AS CountDec, 
   (SumNov/CountNov) AS NovAvgRvn, 
   (SumDec/CountDec) AS DecAvgRvn
FROM trnsact 
WHERE stype = 'p' 
  -- don't you need a condition to filter for a specific year/month?
  AND EXTRACT(MONTH FROM saledate) IN (11,12) 
GROUP BY store 
ORDER BY store;