首页 > 解决方案 > 按列值查询某些行的联合和分组

问题描述

我有一张名为 Products 的表。我正在尝试编写一个查询来根据and对total_amtand的值求和。total_numyearproduct_code

total_amt_by_prod并且total_num_by_prod是预期的输出。

产品代码 amt1 amt2 amt3 total_amt total_amt_by_prod 数字1 num2 num3 总数 total_num_by_prod
2020 LA2013288 10000 无效的 无效的 10000 10000 4 1 3 8 8
2021 XS2014184 无效的 无效的 103330531 103330531 291396632 1 无效的 无效的 1 3
2021 XS2014184 无效的 无效的 90404990 90404990 291396632 1 无效的 无效的 1 3
2021 XS2014184 无效的 无效的 97661111 97661111 291396632 1 无效的 无效的 1 3
2022 XS2014184 无效的 无效的 52648 52648 52648 1 无效的 无效的 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_prodand的值total_num_by_prod

标签: sqlsql-servertsqlgroup-byunion

解决方案


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

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

并为 num 做类似的事情

OVER/PARTITION BY 有点像要求数据库运行一个子查询,该查询按分区分组并对总和中的任何内容求和,然后根据 year,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)

如果您不继续使用窗口功能,您也可以这样做(但它们是一条更优的路线)

顺便说一句,如果这里只是 amt 列之一中的值,您可以将代码整理到:

COALESCE(amt1,amt2,amt3,0)

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


推荐阅读