按列值查询某些行的并集和分组

Query for union and grouping of some rows by column values

我有一个名为 Products 的 table。我正在尝试编写一个查询以根据 yearproduct_code.

total_amttotal_num 的值求和

total_amt_by_prodtotal_num_by_prod 是预期的输出。

year product_code amt1 amt2 amt3 total_amt total_amt_by_prod num1 num2 num3 total_num total_num_by_prod
2020 LA2013288 10000 NULL NULL 10000 10000 4 1 3 8 8
2021 XS2014184 NULL NULL 103330531 103330531 291396632 1 NULL NULL 1 3
2021 XS2014184 NULL NULL 90404990 90404990 291396632 1 NULL NULL 1 3
2021 XS2014184 NULL NULL 97661111 97661111 291396632 1 NULL NULL 1 3
2022 XS2014184 NULL NULL 52648 52648 52648 1 NULL NULL 1 1

我目前拥有的:

SELECT 
    *,
    NVL(amt1, 0) + NVL(amt2, 0) + NVL(amt3, 0) total_amt,
    NVL(num1, 0) + NVL(num2, 0) + NVL(num2, 0) total_num
FROM Products
    

我不知道如何获取total_amt_by_prodtotal_num_by_prod的值。

按产品分类的总金额,按年份..

SUM(NVL(amt1, 0) + NVL(amt2, 0) + NVL(amt3, 0)) OVER(PARTITION BY year, product_code)

并为 num

做类似的事情

OVER/PARTITION BY 有点像要求数据库 运行 一个子查询,该子查询按分区分组并对总和中的任何内容求和,然后根据年份值,product_code

换句话说,你可能更熟悉它,比如

FROM Products
INNER JOIN (SELECT year, product_code, sum(..) as total_by_year_prod FROM Products GROUP BY year, product_code) x 
  USING(year, product_code)

如果您不继续使用 window 函数,您也可以这样做(但它们是稍微更优的路线)

顺便说一下,如果这里只是其中一个 amt 列中的值,您可以将代码整理为:

COALESCE(amt1,amt2,amt3,0)

COALESCE 从左到右选择它遇到的第一个非空参数

select year, product_code, 
    sum(isnull(amt1, 0) + isnull(amt2, 0) + isnull(amt3, 0)) total_amt, 
    sum(isnull(num1, 0) + isnull(num2, 0) + isnull(num2, 0)) total_num
from Products
group by year, product_code