sql - 添加具有另一列总和的列以进行查询

sql - add column with sum of another column to query

我有一个相当复杂的嵌套查询,其结构如下:

select descr, sum(percentage) as perc from
( COMPLEX QUERY HERE)
as A group by descr  order by perc desc

这个查询的结果是这样的:

descr                           perc
------------------------------------
bottom (1 * 18 cm²)             2.77
totalarea (1 * 70 cm²)          2.49
innerwalls (1 * 22 cm²)         2.37
bottom (2 * 12 cm²)             1.55
innerwalls (2 * 17 cm²)         1.51
risperror                       0.29
totalnumberdefects (1 * 30 cm²) 0.00
clipserror                      0.00
outerwalls (1 * 18 cm²)         0.00
outerwalls (2 * 16 cm²)         0.00

现在我需要添加一个包含 perc 的 Sum() 的列,所以在这种情况下我希望结果是这样的:

descr                           perc        sum
------------------------------------------------
bottom (1 * 18 cm²)             2.77       10.98
totalarea (1 * 70 cm²)          2.49       10.98
innerwalls (1 * 22 cm²)         2.37       10.98
bottom (2 * 12 cm²)             1.55       10.98
innerwalls (2 * 17 cm²)         1.51       10.98
risperror                       0.29       10.98
totalnumberdefects (1 * 30 cm²) 0.00       10.98
clipserror                      0.00       10.98
outerwalls (1 * 18 cm²)         0.00       10.98
outerwalls (2 * 16 cm²)         0.00       10.98

鉴于查询真的很复杂而且很慢,我想从上面查询的结果开始添加上面的列,而不必为结果再次调用相同的查询。

如何做到这一点?

您可以对结果使用 SUM window 函数:

WITH myquery AS (
  select descr, sum(percentage) as perc from
  ( COMPLEX QUERY HERE)
  as A group by descr  order by perc desc
)
SELECT *, SUM(perc) OVER () AS "sum"
FROM myquery

sum()与window函数一起使用:

SELECT *,SUM(perc) OVER (RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
FROM (your_complex_sql_query) j

框架 RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 在这种情况下是可选的 - 因为框架没有顺序或分区 - 但将事情明确化被认为是一种很好的做法。所以你也可以只使用 OVER ()

SELECT *,SUM(perc) OVER ()
FROM (your_complex_sql_query) j

演示:db<>fiddle

不使用分组依据:

我用window function sum()得到了总perc和descr的总perc。

SELECT DISTINCT descr,
       SUM(perc) OVER (PARTITION BY descr) AS perc,
       SUM(perc) OVER () AS "sum"
FROM (COMPLEX QUERY HERE) AS sq;       

或使用CTE:

WITH cte AS (COMPLEX QUERY HERE)

SELECT DISTINCT descr,
       SUM(perc) OVER (PARTITION BY descr) AS perc,
       SUM(perc) OVER () AS "sum"
FROM cte;