使用 SQL“sum”和“over”语法的 Totals 和 Runningtotals
Posted
技术标签:
【中文标题】使用 SQL“sum”和“over”语法的 Totals 和 Runningtotals【英文标题】:Totals and Runningtotals with SQL "sum" and "over" Syntax 【发布时间】:2020-03-19 10:34:46 【问题描述】:在我的 SQL 表中,我有“国家”和“we200326”列。 “we200326”列仅包含“1”或“NULL”条目。
我正在尝试获取“we200326”列中所有“1”的总数以及国家/地区的总数。我写了以下语句,但它给出了一个错误,但我不知道我做错了什么(我对此很陌生):
SELECT country, we200326,
(SUM(we200326) OVER () AS Total)
(SUM(we200326) OVER (PARTITION BY country) AS CountryTotal)
FROM table_name
ORDER BY CountryTotal, Country;
我得到的错误是这样的:
mysql said: Documentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'OVER () AS Total)
(SUM(we200326) OVER (PARTITION BY country) AS CountryTotal)
' at line 2
我搜索了类似的错误并发现了几个(每次都是一个简单的语法错误,如空格或逗号左右)我尝试了几个版本,但在按照这些说明操作时无法解决我的问题。任何帮助,将不胜感激。
【问题讨论】:
您好 J.K.,欢迎来到 Stack Overflow。您在第一个窗口总和后缺少一个逗号。此外,总和周围的括号是多余的。 谢谢 - 哇超快的答案!我添加了逗号并删除了多余的括号,但现在我得到以下信息:#1064 - 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 2 行的 '() AS Total, SUM(we200326) OVER (PARTITION BY country) AS CountryTotal FROM k' 附近使用正确的语法 您正在运行哪个版本的 MySQL (select version()
)?窗口函数需要 MySQL 8.0。
我正在通过 phpMyAdmin 界面运行 5.7.29-32-log 版本
请更新您的问题。或者删除它。
【参考方案1】:
窗口函数仅在 MySQL 8.0 中可用。
在早期版本中,一种选择是使用子查询:
select
country,
wewe200326,
(select sum(we200326) from table_name) total,
(select sum(we200326) from table_name t1 where t1.country = t.country) country_total
from table_name t
order by country_total, country
【讨论】:
谢谢!现在它起作用了。我只需要在最后一行添加一个逗号即可使其完整。按country_total,国家/地区排序以上是关于使用 SQL“sum”和“over”语法的 Totals 和 Runningtotals的主要内容,如果未能解决你的问题,请参考以下文章
Oracle SQL:使用 SUM OVER PARTITION 更新表