使用 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的主要内容,如果未能解决你的问题,请参考以下文章

SQL 统计某一列出现的总和

Oracle SQL:使用 SUM OVER PARTITION 更新表

T-SQL-Sum over Partition by 与 group by 组合

Prometheus之sum_over_time函数

开窗函数

SQL语句——17统计函数