按列值查询某些行的联合和分组

Posted

技术标签:

【中文标题】按列值查询某些行的联合和分组【英文标题】:Query for union and grouping of some rows by column values 【发布时间】:2021-08-12 11:33:40 【问题描述】:

我有一个名为 Products 的表。我正在尝试编写一个查询来根据yearproduct_codetotal_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的值。

【问题讨论】:

你考虑过/尝试过窗口函数吗? 为什么产品代码 XS2014..“产品总量”有两个不同的值?它实际上是“按年按产品计算的总金额”吗? @CaiusJard 是的,按年份和产品分类 @DaleK 删除了图片 【参考方案1】:

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

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 从左到右选择它遇到的第一个非空参数

【讨论】:

我使用了 OVER/PARTITION。感谢您的回答! amt1、amt2 和 amt3 中都有值,但我只是没有显示所有行。 COALESCE 对我来说是一个新概念,感谢您也将其添加到您的答案中!【参考方案2】:
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

【讨论】:

我的好答案包括对您如何解决问题的描述以及工作代码。

以上是关于按列值查询某些行的联合和分组的主要内容,如果未能解决你的问题,请参考以下文章

按列值分组的列值更新mysql排名

Power Query M - 使用自定义聚合(百分位)按列值分组

ListView 按列值分组

ListView按列值分组

如何按列值的计数进行分组并对其进行排序?

如何在 Pandas 数据框中按列值分组