作为子查询一部分的 SQL 列的运行总计

田中斋藤

这里的很多帖子都描述了如何进行运行总计,但我面临的情况是运行总计需要是使用子查询计算的列的总计(这意味着我当前的 ORDER BY 导致查询失败)

我有一个表格显示每个时间段的金额,如下所示:

TimePeriod   Amount
2022-03-31   396
2022-03-31   16
2022-03-31   84
2021-12-31   842
2021-12-31   57
2021-09-30   652
2021-09-30   25
2021-09-30   173

在我的查询中,我需要找到每个时间段的总数百分比。我所做的是这样的:

SELECT 
    TimePeriod,
    SUM(Amount) AS 'Total Per Period', 
    CAST( ROUND( SUM(Amount)/(SELECT SUM(Amount) FROM MyDatabase.MyTable),3) AS DECIMAL(12,3)) AS 'Percentage of Total'
FROM
    MyDatabase.MyTable
GROUP BY
    TimePeriod
ORDER BY
    TimePeriod DESC

这给了我一个正确的输出,如下所示:

TimePeriod   Total per Period   Percentage of total
2022-03-31   496                0.221
2021-12-31   899                0.400
2021-09-30   850                0.379

我想要做的是添加“总百分比”列的运行总计,例如:

TimePeriod   Total per Period   Percentage of total   Running total percentage
2022-03-31   496                0.221                 0.221
2021-12-31   899                0.400                 0.621
2021-09-30   850                0.379                 1.000

我尝试做的是首先将它添加到第一个 SELECT 子句中,但这不起作用,因为它是仅存在于我的查询中的列。然后我尝试选择该选择,如下所示:

SELECT
    TimePeriod,
    'Total Per Period',
    'Percentage of Total',
    SUM('Percentage of Total') OVER (ORDER BY TimePeriod)
FROM
    (SELECT 
        TimePeriod,
        SUM(Amount) AS 'Total Per Period', 
        CAST( ROUND( SUM(Amount)/(SELECT SUM(Amount) FROM MyDatabase.MyTable),3) AS DECIMAL(12,3)) AS 'Percentage of Total'
    FROM
        MyDatabase.MyTable
    GROUP BY
        TimePeriod
    ORDER BY
        TimePeriod DESC)

这会引发错误,指出子查询中不允许最后一个 ORDER BY。相反,删除 ORDER BY 表示语法不正确。我猜问题是我有一个引用子查询结果的子查询,但我不确定如何解决这个问题。我的查询中似乎缺少什么?

查理脸

您有一些语法错误,以及一些需要改进的地方:

  • 如另一个答案中所述,派生表需要别名
  • 如有必要,用于[]引用列名(最好一开始就没有这样的列名)。
  • 您不能ORDER BY在派生表或子查询中使用,这样做也没有意义。
  • 您可以用窗口函数替换SELECT SUM子查询。SUM(SUM) OVER ()
  • 运行总窗口函数必须有ROWS UNBOUNDED PRECEDING如果TimePeriod可能有重复。它也更快。
  • 因为您是按 排序的TimePeriod DESC,所以以与主要顺序相同的顺序执行运行总计可能会更快,ORDER BYROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING结果相同。好处是查询计划中的排序减少了。
SELECT
    TimePeriod,
    [Total Per Period],
    [Percentage of Total],
    SUM([Percentage of Total]) OVER (ORDER BY TimePeriod DESC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING)
FROM
    (SELECT 
        TimePeriod,
        SUM(Amount) AS [Total Per Period],
        CAST( ROUND( SUM(Amount) / SUM(SUM(Amount)) OVER () , 3) AS DECIMAL(12,3)) AS [Percentage of Total]
    FROM
        MyDatabase.MyTable
    GROUP BY
        TimePeriod
) t
ORDER BY
    TimePeriod DESC;

进一步的改进是将整个事物合并为一个级别:

SELECT
    TimePeriod,
    SUM(Amount) AS [Total Per Period],
    CAST( ROUND(
            SUM(Amount) /
            SUM(SUM(Amount)) OVER ()
          , 3) AS DECIMAL(12,3)) AS [Percentage of Total],
    CAST( ROUND(
            SUM(SUM(Amount)) OVER (ORDER BY TimePeriod DESC ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) /
            SUM(SUM(Amount)) OVER ()
          , 3) AS DECIMAL(12,3))
FROM
    MyDatabase.MyTable
GROUP BY
    TimePeriod
ORDER BY
    TimePeriod DESC;

请注意,由于四舍五入,结果可能略有不同。

SQL小提琴

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

作为子查询一部分的 SQL 列的运行总计

SPARK SQL 中的相关子查询列不允许作为非等式谓词的一部分

SQL查询以显示列中一部分字符串值

在子查询中选择一个字段作为外部查询的一部分.SQL Server 2008

SQL 将列名的一部分放入另一列

作为哈希子分区的一部分,如何为键指定多个列?

如何获取XML列,该列是SQL中表字段的一部分

SQL将列的一部分复制到新列中

更新列MS SQL中的一部分字符串

比较 SQL Server 中列的一部分的值

从对象类型列SQL中选择字符串的一部分

如何在sql中显示“值”列的一部分?

PostgreSQL 对计数字段的分组查询作为 smth 和总计数字段的一部分

如何编写可以返回0行作为case语句一部分的T-SQL查询

如何选择包含特定子字符串的单词列表作为 SQL 查询 (oracle) 的一部分?

作为类函数一部分的 SQL 查询中的 PHP 变量未按预期工作

使用ComboBox值作为SQL查询的一部分吗?(MS Access 2010-2013)

SQL查询找到运行总计

SQl如何检查列记录是否包含另一列记录的一部分

SQL查找替换字符作为字符串的一部分

如何在Oracle SQL中更新作为组合键的一部分并用作一个表的主键和其他表的外键的列

我的 SQL 查询指出我的查询不包括指定的表达式作为聚合函数的一部分

SQL - 试图判断查询的哪一部分与“OR”语句匹配

重用已选择的SQL查询结果的一部分-也不要重复自身

python将列表的元素分发到sql查询的一部分

在 PL/SQL 中为查询的一部分声明语句

代码可以独立运行,但不能作为整个程序的一部分

作为构建的一部分,在TFS 2017中运行Code-UI

作为Shell脚本的一部分,如何在后台运行隧道