查找 SQL 聚合函数调用中的百分比可能没有嵌套聚合或窗口函数

Posted

技术标签:

【中文标题】查找 SQL 聚合函数调用中的百分比可能没有嵌套聚合或窗口函数【英文标题】:find the percentage in SQL aggregate function calls may not have nested aggregate or window function 【发布时间】:2021-10-29 06:53:57 【问题描述】:

我有一个带有用户 ID 列的表现金返还,以及“食品”、“部门”等现金返还类别 我想要计算每个用户 ID 的返现类别 所以我使用了 COUNT(cashback.report_store_categoryname) 作为 Total_AOV 现在也想占它的百分比 所以我使用了 Total_AOV*100/SUM(Total_AOV)

SELECT 
  cashback.userid, COUNT(cashback.report_store_categoryname) as Total_AOV,
  CAST(CASE WHEN Total_AOV*100/SUM(Total_AOV)>50 THEN 1 ELSE 0 END AS bit) as per
FROM cashback
WHERE cashback_status = 'Confirmed'
GROUP BY cashback.userid
LIMIT 10;

但这给了我一个错误

OUTPUT:聚合函数调用可能没有嵌套聚合或 窗口函数

【问题讨论】:

您不能在定义的同一个 SELECT 列表中引用 Total_AOV。 解析器应该如何知道,您需要在所有行上总结 Total_AOV,但不是在 group by 的上下文中? 可能想要标记您的 DBMS,因为您的查询原样会导致至少在 MSSQL 中出现语法错误(我假设其他人)。甚至没有产生你的聚合函数错误。我也不清楚你真正想用你的演员/案例陈述实现什么,因为你不会从中得到一个百分比。这是肯定的。 那我怎样才能得到它 建议解决方案 【参考方案1】:

在纯标准 ISO SQL 中,可以这样写:

SELECT 
  cashback.userid, COUNT(cashback.report_store_categoryname) as Total_AOV,
  CAST(CASE WHEN (COUNT(cashback.report_store_categoryname))*100/SUM(COUNT(cashback.report_store_categoryname)) OVER()>50 THEN 1 ELSE 0 END AS bit) as per
FROM cashback
WHERE cashback_status = 'Confirmed'
GROUP BY cashback.userid

【讨论】:

错误:不支持指定的类型或函数(每个 INFO 消息一个) 在windows中使用 您没有向我们提供您使用的 DBMS。这在大多数 RDBMS 上都可以正常工作! per 作为 ISO SQL 保留字,即如果用作标识符,则必须以 "per" 分隔。 (en.wikipedia.org/wiki/SQL_reserved_words) 否则语法没问题。

以上是关于查找 SQL 聚合函数调用中的百分比可能没有嵌套聚合或窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

SQL 需要聚合函数而不是奇异值

什么时候可以将聚合函数嵌套在标准 SQL 中?

重学SQL窗口函数

mongodb - 没有本地的聚合查找

sql聚合函数的应用

SQL:多个嵌套聚合函数