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;
我有一个相当复杂的嵌套查询,其结构如下:
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;