【问题标题】:find the percentage in SQL aggregate function calls may not have nested aggregate or window function查找 SQL 聚合函数调用中的百分比可能没有嵌套聚合或窗口函数
【发布时间】: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 中出现语法错误(我假设其他人)。甚至没有产生你的聚合函数错误。我也不清楚你真正想用你的演员/案例陈述实现什么,因为你不会从中得到一个百分比。这是肯定的。
  • 那我怎样才能得到它
  • 建议解决方案

标签: sql group-by count sum percentage


【解决方案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) 否则语法没问题。
猜你喜欢
  • 2022-01-12
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 2016-03-20
  • 1970-01-01
相关资源
最近更新 更多