查找 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 聚合函数调用中的百分比可能没有嵌套聚合或窗口函数的主要内容,如果未能解决你的问题,请参考以下文章